首页 > 解决方案 > 在java中读取非常大的文本文件

问题描述

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

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

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

标签: javainputstreambufferedreaderinputstreamreader

解决方案


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 实现可能会有所不同。


推荐阅读