以下のコードは、ある URL からファイルをダウンロードし、ローカル ファイルに保存します。簡単なことです。ここで何が間違っている可能性がありますか?
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;
}
ここに質問を投稿する理由は、99.999% の時間で動作し、このコードを実行しているコンピューターにウイルス対策ソフトウェアまたはその他の保護ソフトウェアがインストールされている場合は常に期待どおりに動作しないためです。コードを停止 (または無効化) するたびに、コードが再び完全に機能するため、盲目的にそのように指摘しています。このような干渉の最終結果は、ダウンロードされたファイルの MD5 が予想と一致せず、まったく新しい物語が始まることです。
問題は、スマートな「保護」ソフトウェアが、私が知らないうちに URL からの実際のストリームを変更する可能性があるということです。はいの場合、これにどのように対処しますか?(カスペルスキー製品とノートン製品で検証済み)。
編集-1: どうやら私は問題を把握しており、ウイルス対策とは何の関係もありません。ダウンロードは FTP サーバー (特に FileZilla) から行われ、クライアント側で apache commons ftp を使用します。私がしたことは、FTPサーバーに行き、ダウンロードの途中で接続を終了しました(キックアウトしました)。クライアント側で is.read(..) が IOException をスローすると予想していましたが、これは決して起こりませんでした。代わりに、 is.read(..) は -1 を返します。これは、ストリームからのデータがこれ以上ないことを意味します。これは間違いなく予期しないことであり、部分的なファイルが時々取得される理由を説明しています。ただし、これは、データが変更される場合がある理由を説明していません。