在Java中读取非常大的文本文件

时间:2018-06-22 07:54:25

标签: java inputstream bufferedreader inputstreamreader

我正在使用以下代码读取大文件:

InputStreamReader isr = new InputStreamReader(new FileInputStream(FilePath));
BufferedReader br = new BufferedReader(isr);
while ((cur = br.readLine()) != null)

我能够使用上述代码读取大文件,但我想知道这些读取器在内存中的内部工作方式。 inputstreamreader扮演什么角色?逐行读取文件(例如2 GB)时分配了多少内存?

1 个答案:

答案 0 :(得分:4)

InputStreamReader是一种根据某些字符集将原始InputStream(字节流)转换为字符流的工具。 FIleInputStream是来自给定文件的字节流(它扩展了InputStream)。例如,您还可以使用InputStreamReader来从套接字读取文本,因为socket.getInputStream()也提供了InputStream。

InputStreamReader是Reader,它是字符流的抽象类。单独使用InputStreamReader效率低下,因为每个“ readLine”实际上都会从文件中读取。当您使用BufferedReader装饰时,它将读取一个字节的块并将其保留在内存中,并用于后续读取。

关于大小:文档未说明默认值:

https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

  

可以指定缓冲区大小,也可以使用默认大小。的   默认值对于大多数用途来说足够大。

您必须检查源文件才能找到该值。

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/io/BufferedReader.java

这是OpenJDK中的实现:

 private static int defaultCharBufferSize = 8192;

Oracle的开源JDK实现可能有所不同。