我了解在Java中读取大型文本文件有两种方法。一种是使用Scanner,另一种是使用BufferedReader。
或者使用 while 循环
更具体地说,这里是读取250M文件的测试用例结果。
扫描器案例: 行号-总内存 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
缓冲读取器案例: 行号-总内存 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
然而,扫描器速度较慢,这就是我试图避免使用它的原因。
另外,我检查了缓冲读取器的情况,发现内存总量突然在一个随机行中增加。
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文件的测试用例结果。
扫描器案例: 行号-总内存 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
缓冲读取器案例: 行号-总内存 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
后面的缓冲区管理问题... - Jean-Baptiste YunèsBufferedReader
使用5 MB缓冲区时,你并没有在真正比较苹果与苹果。此外,你不会看到大缓冲区的性能提升。你可以将缓冲区大小降低到4 KB或者16 KB,而不会有性能损失。你会发现,即使你只使用默认缓冲区大小,BufferedReader
也比Scanner
要快得多。 - Andreas