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

Reading very large text files in java

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

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

我可以使用上面的代码读取大文件,但我想知道这些读取器在内存中是如何工作的。 inputstreamreader 起什么作用?逐行读取文件(例如 2 GB)时分配了多少内存块?

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

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

关于尺寸:文档没有说明默认值:

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

The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.

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

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

这是OpenJDK中的实现:

 private static int defaultCharBufferSize = 8192;

Oracle 的闭源 JDK 实现可能不同。