【问题标题】:Buffered Input Stream does not load file correctly缓冲输入流未正确加载文件
【发布时间】:2013-02-01 08:29:06
【问题描述】:

我有以下代码来下载文件列表。下载后我将在线文件的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();

【问题讨论】:

  • 如果您使用的是 Java SE 7,请考虑使用新的自动资源管理功能来关闭您的流。

标签: java stream buffer byte


【解决方案1】:

这个坏了:

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 块中的所有流,但这是另一回事。)

【讨论】:

    【解决方案2】:

    第一次读取后 data[] 将包含字节。因此,在最后一次读取期间,数组将包含最后 n 个字节,以及前一次读取的一些字节。实际上,您应该检查读取的返回。它表示已将多少字节读入数组,然后只写出多少字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2016-07-14
      • 2016-12-23
      相关资源
      最近更新 更多