httpurlconnection의 예기치 않은 결과 - 원격 바이너리 파일을 읽습니다

StackOverflow https://stackoverflow.com/questions/611346

  •  03-07-2019
  •  | 
  •  

문제

인터넷에서 다음과 같이 원격 바이너리 파일 (예 : 이미지)을 읽으려고합니다.

HttpURLConnection connection = (HttpURLConnection) myUrl.openConnection(); //myUrl - URL object pointing for some location
if(connection.getResponseCode() == 200){
    File temp = File.createTempFile("blabla", fileName); //fileName - string name of file
    FileOutputStream out = new FileOutputStream(temp);
    int fileSize = Integer.parseInt(connection.getHeaderField("content-length"));
    int counter = 0;
    DataInputStream in = new DataInputStream(connection.getInputStream());
    byte ch[] = new byte[1024];
    System.out.println(counter);
    while((counter += in.read(ch)) > 0){
        out.write(ch);
        if(counter == fileSize){
            out.close();
            break;
        }
    }
}

로컬 웹 서버 (LocalHost)와 함께 완벽하게 작동합니다.

하지만. 그런 다음 MyUrl은 일부 원격 웹 서버에서 파일의 URL입니다. 예상치 못한 결과를 반환합니다. 예를 들어, 주어진 파일의 소스에서 일부 패키지를 반복하는 것으로 보이며 (이전 패키지 또는 약간의 부패로 인해 생각합니다) 결과 파일은 일반적 으로이 반복으로 인해 원래 파일보다 약 10% 더 큽니다. 따라서 파일이 손상되어 이미지 뷰어로 올바르게 열 수 없습니다.

이것을 어떻게 해결할 수 있습니까?

도움이 되었습니까?

해결책

read 전체 버퍼를 반드시 읽을 필요는 없습니다 (특히 스트림 끝에있는 경우).

따라서 루프를 변경하십시오.

for (;;) {
    int len = in.read(ch);
    if (len == -1) {
        break;
    }
    out.write(ch, 0, len);
}

아마도 그 코드를 어딘가에 메소드에 넣을 것입니다.

또한 참고 :

  • 사용 할 필요가 없습니다 DataInputStream 여기 (그래도 readFully 종종 유용합니다).
  • 일반적인 관용구와 함께 항상 자원 (예 : 스트림)을 닫습니다.

    final Resource resource = acquire();
    try {
        use(resource);
    } finally {
        resource.close();
    }
    
  • 아마도 큰 차이는 없지만 1024의 버퍼 크기는 약간 작습니다. 나는 기본적으로 8192로 임의로 기본적으로 경향이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top