gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:09 25 4
gpt4 key购买 nike

我知道在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com