我试图通过使用FileInputStream将文件读入数组,并且~800KB文件花了大约3秒来读入内存.然后我尝试了相同的代码,除了将FileInputStream包装到BufferedInputStream中,它花了大约76毫秒.为什么使用BufferedInputStream以字节逐字节读取文件,即使我仍在逐字节读取它?这是代码(代码的其余部分完全不相关).请注意,这是"快速"代码.如果你想要"慢"代码,你可以删除BufferedInputStream:
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(file));
int[] fileArr = new int[(int) file.length()];
for (int i = 0, temp = 0; (temp = is.read()) != -1; i++) {
fileArr[i] = temp;
}
Run Code Online (Sandbox Code Playgroud)
BufferedInputStream的速度提高了30多倍.远不止于此.那么,为什么会这样,并且可以使这个代码更有效(不使用任何外部库)?
我一直在研究关于java.io.BufferedInputStream和缓冲的博客文章.显然,多年来,默认情况下,从( Java ) Java 7实现的JavaDocs中明确指出,默认值从可疑的512字节增长到8192字节.我的问题还提出了一个问题:谁/什么决定默认应该是什么 - 它不像我预期的那样是黑色和白色.
我很好奇每个版本的默认缓冲区大小是什么,以及它在其他异乎寻常的JVM中可能是什么.到目前为止,我已经通过源代码,JavaDocs或针对1.0,1.1,1.4,Java 5,Java 6的Sun Bug报告以及(再次推测) Sun的Java 7 JVM 进行了跟踪.
我没有出现的是这个价值
那么,我想知道这些价值是什么以及我在哪里找到它们的参考?
或者,如果那里的任何SOped人可能有权访问其中一个安装那个baring.如果是这样,你可以编译并运行下面的代码,然后在这里报告吗?或者,你知道吗?
import java.io.BufferedInputStream;
import java.io.InputStream;
public class BufferSizeDetector extends BufferedInputStream {
public static void main(String[] args) {
BufferSizeDetector bsd = new BufferSizeDetector(null);
System.err.println(System.getProperty("java.version"));
System.err.println(bsd.getBufferSize());
}
public BufferSizeDetector(InputStream in) {
super(in);
}
public int getBufferSize() {
return super.buf.length;
}
}
Run Code Online (Sandbox Code Playgroud) 当我构造一个新的时,BufferedReader它为我提供了8192个字符的缓冲区。这背后的逻辑/原因是什么?
8192 = 2 to the power of 13
Run Code Online (Sandbox Code Playgroud)