0

我有以下代码来下载文件列表。下载后我将在线文件的md5与下载的文件进行比较。当下载大小低于 1024 字节时,它们是相似的。对于所有超过 1024 字节,有一个不同的 md5 和。

现在我不知道原因。我认为,这取决于 1024 字节的 Array-Size?也许它每次都会将完整的 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 回答