java - 在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,是字符流的抽象类。单独使用 InputStreamReader 效率低下,因为每个“readLine”实际上都会从文件中读取。当您使用 BufferedReader 进行装饰时,它会读取一大块字节并将其保存在内存中,并将其用于后续读取。
关于尺寸:文档没有说明默认值:
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html
可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。
您必须检查源文件才能找到该值。
这是 OpenJDK 中的实现:
private static int defaultCharBufferSize = 8192;
Oracle 的闭源 JDK 实现可能会有所不同。
推荐阅读
- javascript - 赛普拉斯中的两个新网址,但第二个缺少路径变量
- java - 如何从 Java 中的多个 txt 文件(50 个文件)中读取带有特殊字符的特定行
- c++ - 使用 STL 的 C++ 库的 Visual Studio 二进制兼容性
- ubuntu - ubuntu中的nvidia,已安装但未考虑
- java - 无法安全重写的“android.support.design.widget”
- javascript - jQuery添加
- java - 在 Kotlin 中返回抛出异常
- google-cloud-datastore - 为什么从 Compute Engine 对 Google API 的调用会间歇性地失败,并出现错误“网络无法访问”和 IPv6 子网?
- angular - 从 edge://policy (chrome://policy) 获取 JSON 数据到 Angular 应用
- sql-server - 根据作业类别授予执行代理作业的权限