BufferedReader会将整个文件加载到内存中吗?

use*_*161 5 java io

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);
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

想象一下,我有一个价值几百兆的日志文件。上面的代码是否会将整个文件加载到内存中?如果是这样,在这里缓冲的真正好处是什么?

我正在读取文件I / O,无法掌握是要在内存中加载相当于上面一行(currentLine)的字节,还是将整个文件加载到内存中,然后读取每一行并将其分配给变量in再次记忆。

请告诉我这样可以避免将整个文件加载到内存中的方式。

T.J*_*der 5

上面的代码会在内存中加载整个文件吗?

不。

如果是这样,在这里缓冲的真正好处是什么?

好处是在读取数据块的时间,这通常比在同一时间或类似的阅读一个字符更高效,缓冲它让你的界面,数据仍然是颗粒状,你希望它是(readreadLine,等.)

这是BufferedReader文档的摘录:

从字符输入流中读取文本,缓冲字符以便有效读取字符、数组和行。 可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

通常,Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包装在任何 read() 操作可能代价高昂的 Reader 周围,例如 FileReaders 和 InputStreamReaders。例如,

BufferedReader in
  = new BufferedReader(new FileReader("foo.in"));
Run Code Online (Sandbox Code Playgroud)

将缓冲来自指定文件的输入。如果没有缓冲,每次调用read()orreadLine()都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。

(我的重点)