아래 코드는 일부 URL에서 파일을 다운로드하고 로컬 파일에 저장합니다. 케이크 한 조각. 여기에 무엇이 잘못 될 수 있습니까? 그것은 시간의 99.999 %에서 작동 및 안티 바이러스 또는이 코드를 실행하는 컴퓨터에 설치된 다른 보호 소프트웨어가있을 때마다 예상대로 작동하지 않기 때문에데이터 스트림을 누가 조작합니까?
protected long download(ProgressMonitor montitor) throws Exception{
long size = 0;
DataInputStream dis = new DataInputStream(is);
int read = 0;
byte[] chunk = new byte[chunkSize];
while((read = dis.read(chunk)) != -1){
os.write(chunk, 0, read);
size += read;
if(montitor != null)
montitor.worked(read);
}
chunk = null;
dis.close();
os.flush();
os.close();
return size;
}
이유는 내가 여기에 질문을 게시하고있다. 내가 막을 때마다 코드가 완벽하게 작동하기 때문에 나는 맹목적으로 손가락을 가리키고있다. 이러한 간섭의 최종 결과는 다운로드 한 파일의 MD5가 예상과 일치하지 않으며 완전히 새로운 무용담이 시작된다는 것입니다.
그래서, 어떤 스마트 한 "보호"소프트웨어가 내가 알지 못하는 사이에 URL에서 오는 실제 스트림을 변경하게 될 가능성이 있습니까? 그리고 그렇다면 어떻게해야합니까? (은 Kasperksy 및 Norton 제품과 함께 확인되었습니다.).
편집-1 : 은 분명히 내가 문제에 보류있어 그것은 antiviruses 함께 할 아무것도있다. 다운로드는 FTP 서버 (특히 FileZilla)에서 이루어지며 우리는 클라이언트 측에서 apache commons ftp를 사용합니다. 내가 한 일은 FTP 서버에 가서 다운로드 중간에 연결을 종료했다는 것입니다. 나는 is.read (..)가 클라이언트 측에서 IOException을 던질 것이라고 예상했지만, 이것은 결코 발생하지 않았다. 대신에 is.read (..)는 스트림에서 오는 데이터가 더 이상 없다는 것을 -1을 반환합니다. 이것은 분명히 예기치 않은 일이며 때로는 부분 파일을 가져 오는 이유를 설명합니다. 그러나 때때로 데이터가 변경되는 이유는 설명하지 않습니다.
'barfs'를 정의하십시오. – EJP
exeptions는 어떻게 처리합니까? 'dis.close()'가 예외를 던지면 출력 스트림이 제대로 닫히지 않습니다. – dacwe
@dacwe -이 메소드에서 던져진 것이 모두 실패하면 모든 것이 중단됩니다. 수수께끼는 아무것도 던져지지 않는다는 것입니다. 모든 것이 잘 다운로드됩니다. 문제는 내가 기대하는 데이터가 아니라 대부분이 반으로 줄어들거나 때로는 변경된 것입니다. – Dima