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

8
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)加载到内存中,还是整个文件都进入内存,然后再读取并分配给内存中的变量。

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


一个好问题,但可以用更好的措辞。 - Rabbit Guy
1个回答

5

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

不会。

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

好处在于分块读取数据,通常比逐个字符或类似方式读取更有效,并缓冲它,以便您与数据的接口仍然像您希望的那样粒度化(readreadLine 等)。

以下是 BufferedReader 文档 的摘录:

Reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines. The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.

In general, each read request made of a Reader causes a corresponding read request to be made of the underlying character or byte stream. It is therefore advisable to wrap a BufferedReader around any Reader whose read() operations may be costly, such as FileReaders and InputStreamReaders. For example,

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

will buffer the input from the specified file. Without buffering, each invocation of read() or readLine() could cause bytes to be read from the file, converted into characters, and then returned, which can be very inefficient.

(我的强调)


foo.in 动态增长的情况是什么? - prime
从您的帖子中我所理解的方式是,缓冲读取器将读取与缓冲区大小对应的 'n' 行,并且这些行将保存在内存中。然后,在 readLine 方法实现中,会从缓冲区发出一行字节。我是正确的吗?因此,上述方法将没有扩展问题,对吗? - user7246161
@prime:这将是一个完全不同的问题,与此处的问题无关。(答案是:当非缓冲读取器读取一个增长的文件时会发生什么。) - T.J. Crowder
@user7246161:如果有n量的数据,如果它在底层的Reader上使用了readLine,我会感到惊讶(但这是开源的,你可以轻松地自己查找——在JDK目录下的src.jar文件中)。我希望它能够读取块(比如4k)并处理这些行。但是,如果您需要那种详细级别的信息,请检查源代码。基本上:它将读取足够满足您的请求的内容。它不会尝试加载整个文件。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接