我有以下代码来下载文件列表。下载后,我将在线文件的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();
答案 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个字节,以及前一个读取的一些字节。实际上你应该检查读取的返回。它表示已经读入了多少字节数,并且只写了那么多字节。