java - 使用 buffredReader 在 java 中读取大文件

标签 java

我知道在 java 中有两种读取大文本文件的方法。一种是使用扫描仪,一种是使用 bufferedreader。

Scanner reader = new Scanner(new FileInputStream(path));
while (reader.hasNextLine()){
    String tempString = reader.nextLine();
    System.out.println(java.lang.Runtime.getRuntime().totalMemory()/(1024*1024.0));
}

并且要打印的数字总是稳定在某个值附近。

但是,当我按照下面的编辑使用 bufferedReader 时,数字不稳定,它可能在一行中突然增加(大约 20mb),然后在多行(如 8000 行)中保持不变。然后重复这个过程。 谁知道为什么?

更新 我使用 BufferedReader 键入的第二种方法错误,这是应该的

BufferedReader reader = new BufferedReader
    (new InputStreamReader(new FileInputStream(path)),5*1024*1024);
for(String s = null;(s=reader.readLine())!=null; ){
    System.out.println(java.lang.Runtime.getRuntime().totalMemory()/(1024*1024.0));
}

或者使用while循环

String s;
while ((s=reader.readLine())!=null ){
    System.out.println(java.lang.Runtime.getRuntime().totalMemory()/(1024*1024.0));
}

更具体地说,这是一个测试用例读取250M文件的结果

扫描仪外壳:

行号---totolmemory
5000---117.0
10000---112.5
15000---109.5
20000---109.5
25000---109.5
30000---109.5
35000---109.5
40000---109.5
45000---109.5
50000---109.5

BufferedReader 案例:

行号---totolmemory
5000---123.0
10000---155.5
15000---155.5
20000---220.5
25000---220.5
30000---220.5
35000---220.5
40000---220.5
45000---220.5
50000---211.0

但是扫描仪速度很慢,这就是我尽量避免使用它的原因。

然后我检查了 bufferedReader 的情况,总内存在单个随机行中突然增加。

最佳答案

就其本身而言,扫描仪并不是特别适合文本文件。

Scanner 和 BufferedReader 没有可比性。您可以在 Scanner 中使用 BufferedInputStream - 然后您将拥有相同的东西,Scanner 添加了更多的“流”读取功能,而不仅仅是行。

查看 totalMemory 并不是特别有用。引用 Javadoc:返回 Java 虚拟机中的内存总量。此方法返回的值可能会随时间变化,具体取决于主机环境。

试试 freeMemory,它更有趣一点,反射(reflect)了时不时发生的 GC 阶段。

稍后 对 Scanner 速度慢的评论:读取一行只需要扫描行分隔符的字节,而 BufferedReader 就是这样做的。但是,扫描器为此任务启动了 java.util.regex.Matcher(因为它更适合其整体设计)。将扫描仪仅用于读取行是打破车轮上的蝴蝶。

关于java - 使用 buffredReader 在 java 中读取大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36375627/

相关文章:

java - Android Studio 2.2.3 : Gradle project sync failed. 基本功能(如编辑、调试)无法正常使用

java - 如何在状态栏显示背景?

java - 智能逻辑查询 PostgreSQL 函数内部的性能

java - 从数据库内容填充微调器 (SQLite)

java - Maven 无法下载,因为 Maven Central 出现 PKIX 错误

java - 如何在 Play 框架的文件中记录数据?

java - java 8 中的日期格式化程序

java - 列表中的 CSV 或 JSON 文件

java - equals() 和 hashCode() 的区别

java - 尝试使用 JConsole 连接到 RaspberryPi jvm