5

以下のコードは、ある 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 を返します。これは、ストリームからのデータがこれ以上ないことを意味します。これは間違いなく予期しないことであり、部分的なファイルが時々取得される理由を説明しています。ただし、これは、データが変更される場合がある理由を説明していません。

4

1 に答える 1

1

ええ、これはいつも私に起こります。私の場合、企業ネットワーク上の Websense による透過的な HTTP プロキシが原因です。最悪の問題は、ブロック ページが 200 OK で返されることによって発生します。

毎回同じまたは類似の破損が発生しますか? たとえば、リクエストがブロックされた理由を説明する HTML が表示されますか? おそらく最善の方法は、ダウンロードしたデータの最初の数バイトをブロック ページ内のテキストと比較し、この場合は例外をスローすることです。

編集: あなたの更新に基づいて、FTP クライアントをイメージ/バイナリ モードに設定しましたか?

于 2012-08-16T10:47:54.180 に答える