class LogReader {
public void readLogFile(String path){
BufferedReader br = new BufferedReader(new FileReader(path));
String currentLine=null;
while(currentLine=br.readLine()!=null){
System.out.println(currentLine);
}
}
}
想象一下我有一个价值数百兆的日志文件。上面的代码会将整个文件加载到内存中吗?如果是这样,这里缓冲的真正好处是什么?
我正在阅读文件 I/O,无法理解我们是否会将值得一行(currentLine)的字节加载到内存中,或者整个文件进入内存,然后读取每一行并将其分配给变量再次记忆。
如果不是这样,请告诉我如何避免将整个文件加载到内存中。
上面的代码会将整个文件加载到内存中吗?
No.
如果是这样,这里缓冲的真正好处是什么?
这样做的好处是一次读取一个数据块,这通常比一次读取一个字符或类似的数据更有效,并对其进行缓冲,以便您的数据接口仍然像您希望的那样精细(read
, readLine
, etc.).
这是摘录自BufferedReader文档 http://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html:
从字符输入流读取文本,缓冲字符,以便高效读取字符、数组和行。可以指定缓冲区大小,也可以使用默认大小。默认值足够大,足以满足大多数用途。
一般来说,Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包装在任何 read() 操作可能成本较高的 Reader 周围,例如 FileReaders 和 InputStreamReaders。例如,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。如果没有缓冲,每次调用read()
or readLine()
可能会导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。
(我的重点)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)