2017-08-01 111 views
2
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的日志文件。上面的代码会将整个文件加载到内存中吗?如果是这样,缓冲的真正好处是什么?Will BufferedReader会将整个文件加载到内存中吗?

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

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

+0

一个很好的问题,但它可以更好的措辞。 –

回答

4

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

如果有什么是缓冲这里的真正好处号?

通过读取数据块的时间,这通常比每次读一个字符更高效,缓冲它让你的界面,数据仍然是颗粒状,你希望它是(readreadLine等)。

BufferedReader documentation是关于它做什么很清楚,为什么:

读取文本从字符输入流,缓冲各个字符,从而提供字符,数组和行的高效读取。 可以指定缓冲区大小,或者可以使用默认大小。默认值对于大多数用途而言足够大。

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

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

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

(我的重点)

+0

foo.in动态增长的情况如何? – prime

+0

我从你的文章中了解到的方式是,缓冲读取器将读取与缓冲区大小相对应的'n'行数,这就是内存中的内容。然后,readLine方法实现从缓冲区发出一行字节。我对吗 ?所以上面的方法不会有缩放问题吗? – user7246161

+0

@prime:这将是一个完全独立的问题。 (答案是:当非缓冲读取器正在读取增长的文件时会发生什么。) –

相关问题