0

ファイルのリストをダウンロードするための次のコードがあります。ダウンロードした後、オンラインファイルのmd5をダウンロードしたものと比較します。ダウンロードサイズが1024バイト未満の場合も同様です。1024バイトを超えるすべての場合、異なるmd5合計があります。

今は理由がわかりません。1024バイトの配列サイズに依存すると思いますか?1024バイト全体をファイルに書き込むたびに書き込むかもしれませんが、問題は、なぜ1kb未満のファイルで機能するのかということです。

 String fileUrl= url_str;
 URL url = new URL(fileUrl);
 BufferedInputStream bufferedInputStream = new BufferedInputStream(url.openStream());
 FileOutputStream fileOutputStream =new  FileOutputStream(target);
 BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream, 1024);

 byte data[] = new byte[1024];
 while(bufferedInputStream.read(data, 0, 1024) >0 )
 {
      bufferedOutputStream.write(data);
 }
 bufferedOutputStream.close();
 bufferedInputStream.close();
4

2 に答える 2

4

これは壊れています:

while(bufferedInputStream.read(data, 0, 1024) >0 )
{
      bufferedOutputStream.write(data);
}

すべての読み取り呼び出しがバッファー全体をいっぱいにすることを想定しています。の戻り値を使用する必要がありますread

int bytesRead;
while((bytesRead = bufferedInputStream.read(data, 0, 1024)) >0 )
{
    bufferedOutputStream.write(data, 0, bytesRead);
}

(さらに、すべてのストリームをfinallyブロックで閉じる必要がありますが、それは別の問題です。)

于 2013-02-16T12:43:15.060 に答える
1

最初の読み取り後、data[]にはバイトが含まれます。したがって、最後の読み取り中に、配列には最後のnバイトと、前の読み取りからのいくつかのバイトが含まれます。実際には、読み取りの戻りを確認する必要があります。配列に読み込まれたバイト数を示し、そのバイト数だけを書き込みます。

于 2013-02-16T12:46:57.703 に答える