使用buffredReader读取java

时间:2016-04-02 16:11:53

标签: java

据我所知,有两种方法可以在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案例,总内存在一个随机行中突然增加。

1 个答案:

答案 0 :(得分:3)

就其本身而言,扫描程序对于 big 文本文件并不是特别有用。

Scanner和BufferedReader无法比较。您可以在扫描仪中使用BufferedInputStream - 然后您将拥有相同的功能,扫描仪会添加更多的" stream"阅读功能而不仅仅是线条。

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

尝试freeMemory,它更有趣,反映了GC时不时出现的各个阶段。

<强>后来 评论Scanner的速度很慢:读取一行只需要扫描行分隔符的字节,以及BufferedReader的工作方式。然而,Scanner为此任务启动了java.util.regex.Matcher(因为它更适合其整体设计)。使用扫描仪只是为了阅读线条打破了轮子上的蝴蝶。