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