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

标签 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();

最佳答案

这已损坏:

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

关于java - 缓冲输入流无法正确加载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14910380/

相关文章:

java - 无法在 Spring 应用程序中接收从另一个 Java 应用程序发送的表单数据

c++ - 将数据从 std::istream 保存到文件的最佳方式

node.js - Node.js 中的缓冲区是什么?

java - 如何检查平板电脑是否插入了SD卡 : Android?

java - LWJGL glDrawElements(int, int, int, long) 不绘制任何内容,而 glDrawElements(int, IntBuffer) 正确绘制

javascript - 流/gulp注入(inject)问题

search - Vim:vim 实例之间的持久搜索缓冲区(在 Ubuntu 中)

c - OpenCL 中带有偏移量的固定内存

java - 连接两个 Android 应用程序

C++ 重载 ostream 和 istream 运算符