缓冲输入流无法正确加载文件

时间:2013-02-16 12:39:11

标签: java stream buffer byte

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

2 个答案:

答案 0 :(得分: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块中的所有流,但这是另一回事。)

答案 1 :(得分:1)

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