本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
如何使用Java逐行读取大文本文件?
我需要使用Java逐行读取大约5-6 GB的大型文本文件。
我如何快速做到这一点?
高分回答:
一个常见的模式是使用
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
// process the line.
}
}
如果您假设没有字符编码,则可以更快地读取数据。例如ASCII-7,但差别不大。您处理数据的时间很可能会花费更长的时间。
编辑:一种不太常用的模式,可以避免line泄漏的范围。
try(BufferedReader br = new BufferedReader(new FileReader(file))) {
for(String line; (line = br.readLine()) != null; ) {
// process the line.
}
// line is not visible here.
}
更新:在Java 8中,您可以执行
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
stream.forEach(System.out::println);
}
注意:您必须将Stream放在try-with-resource块中,以确保在其上调用#close方法,否则,直到GC在以后再执行之前,永远都不会关闭基础文件句柄。
高分回答:
看这个博客:
可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。
// Open the file
FileInputStream fstream = new FileInputStream("textfile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
System.out.println (strLine);
}
//Close the input stream
fstream.close();
文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/5…
作者建议: 参考我之前的译文,我用FileChannel来进行传输
我参考了mmap + FileChannel的相关测试,发现会更好。
可以看到,FileChannel的性能是比较高的。
简单说一下,就拿比较火热的rocketMQ来说,它是文件系统来存储数据的,生产和消费数据都是直接操作的文件,它会涉及到页缓存、FileChannel、FileChannel一次性读取1页4kb的数据,高性能得益于ByteBuffer 缓冲区、MMAP内存映射
RokcetMQ为了更好的性能也进行了调优
预分配MappedFile
mlock系统调用
文件预热
顺序读、顺序写
我这里只是进行一个抛砖引玉,大家加油!
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️