【问题标题】:Reading very large text files in java在java中读取非常大的文本文件
【发布时间】:2018-06-22 07:54:24
【问题描述】:

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

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

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

【问题讨论】:

  • 看源码。
  • javadocs 中的来源?我已经经历过了。我的困惑是 inputstreamreader 和 bufferedreader 是如何链接的
  • bufferedReader 需要一个源来读取。这是唯一的链接
  • 这是否意味着 isr 将继续向 br 提供字符流,而 bufferedreader 会将其存储在缓冲区中?如果是这样的话,isr 一次从文件中读取了多少个字符(读取字节并将它们解码为字符)

标签: java inputstream bufferedreader inputstreamreader


【解决方案1】:

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

【讨论】:

  • 你可能应该提到这是来自JDK7
  • fileinputstream stream如何从输入文件中获取字节流?
  • github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/… 看看代码。它需要与 JVM 通信,以便与主机操作系统进行互操作。很难猜到它是怎么做到的。
  • 还有原生(C 或 C++)代码:private native void open(String name) throws FileNotFoundException;
  • 这就是我想知道的。非常感谢!
猜你喜欢
  • 2019-04-30
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多