流式传输时缓冲区字节数组如何连续填充?

时间:2013-08-07 14:22:08

标签: java file streaming

以下用于阅读Files

的代码
 int bytesRead;
 byte[] bytes = new byte[1000];  //buffer
 FileInputStream fis = new FileInputStream(uploadedFile);

    while ((bytesRead = fis.read(bytes)) != -1) {
          fis.read(bytes, 0, bytesRead);
    }

fis.close();

根据api of read() method

  

将此输入流中的b.length个字节数据读入一个字节数组。此方法将阻止,直到某些输入可用。

没有指定它重新填充bytes数组,但流填充array直到file成功read.

但内部是如何保持神奇的?

我看过源代码或读取方法

public int More ...read(byte b[]) throws IOException {
214        return readBytes(b, 0, b.length);
215    }

readBytes的源代码是

200    private native int More ...readBytes
                (byte b[], int off, int len) throws IOException;

有人提到如何bytes ..

我上传了一个500MB的文件没有任何问题,分配1000字节array

2 个答案:

答案 0 :(得分:1)

如果您问为什么可以读取大约1 KB缓冲区的~500 MB文件,那是因为每次循环时都会覆盖缓冲区的内容(大约500,000次)。

如果您正在询问如何实际实现读取功能,请注意基础调用包含关键字native。这意味着通过JNI调用本机代码。确切的实现将取决于JVM和OS。

答案 1 :(得分:1)

great article

发布readBytes {{1}} Michael Schaeffer

简而言之:

  

Java中的文件I / O是通过读入本地缓冲区,然后从本地缓冲区复制到最初传入int read(byte byf [])的Java byte []来实现的。这种双重复制很慢,但如果读取缓冲区大于8K,则还需要堆分配第二个读取缓冲区。

要提及的许多其他有用的细节,但它更容易阅读。