据我所知,有两种方法可以在java中读取大文本文件。一个是使用扫描仪,一个是使用缓冲读取器。
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案例,总内存在一个随机行中突然增加。
答案 0 :(得分:3)
就其本身而言,扫描程序对于 big 文本文件并不是特别有用。
Scanner和BufferedReader无法比较。您可以在扫描仪中使用BufferedInputStream - 然后您将拥有相同的功能,扫描仪会添加更多的" stream"阅读功能而不仅仅是线条。
查看totalMemory并不是特别有用。引用Javadoc:返回Java虚拟机中的内存总量。此方法返回的值可能会随着时间的推移而变化,具体取决于主机环境。
尝试freeMemory,它更有趣,反映了GC时不时出现的各个阶段。
<强>后来强> 评论Scanner的速度很慢:读取一行只需要扫描行分隔符的字节,以及BufferedReader的工作方式。然而,Scanner为此任务启动了java.util.regex.Matcher(因为它更适合其整体设计)。使用扫描仪只是为了阅读线条打破了轮子上的蝴蝶。