2013-02-16 59 views
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(); 
+0

如果您使用的是Java SE 7,请考虑使用新的自动资源管理功能关闭您的流。 – Puce 2013-02-16 13:22:58

回答

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

第一后读取数据[]会包含字节。所以在最后一次读取时,数组将包含最后n个字节,以及前一次读取的一些字节。其实你应该检查读取的返回。它表明有多少字节已被读入阵列,并且只写了很多字节。