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

时间:2017-08-01 18:14:00

标签: 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);
   }
 }
}

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

我正在阅读文件I / O并且无法理解我们是否会在内存中加载上面一行(currentLine)的字节,或者整个文件进入内存然后每行都被读取并分配给内存中的变量。

如果不是这样的话,请告诉我如何避免将整个文件加载到内存中。

1 个答案:

答案 0 :(得分:4)

  

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

没有

  

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

通过一次读取数据块,这通常比一次读取一个字符更有效,并缓冲它以使您的数据接口仍然像您希望的那样精确(readreadLine等。)。

BufferedReader documentation非常明确它的作用,以及原因:

  

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

     

通常,由Reader构成的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议将BufferedReader包装在任何read()操作可能代价高昂的Reader上,例如FileReaders和InputStreamReaders。例如,

BufferedReader in
  = new BufferedReader(new FileReader("foo.in"));
     

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

(我的重点)