以下用于阅读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();
将此输入流中的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
。
答案 0 :(得分:1)
如果您问为什么可以读取大约1 KB缓冲区的~500 MB文件,那是因为每次循环时都会覆盖缓冲区的内容(大约500,000次)。
如果您正在询问如何实际实现读取功能,请注意基础调用包含关键字native
。这意味着通过JNI调用本机代码。确切的实现将取决于JVM和OS。
答案 1 :(得分:1)
readBytes
{{1}} Michael Schaeffer
简而言之:
Java中的文件I / O是通过读入本地缓冲区,然后从本地缓冲区复制到最初传入int read(byte byf [])的Java byte []来实现的。这种双重复制很慢,但如果读取缓冲区大于8K,则还需要堆分配第二个读取缓冲区。
要提及的许多其他有用的细节,但它更容易阅读。