如何使用Java逐行读取大文本文件?推荐| Java Debug 笔记

1,995 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

如何使用Java逐行读取大文本文件?

我需要使用Java逐行读取大约5-6 GB的大型文本文件。

我如何快速做到这一点?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

一个常见的模式是使用

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在以后再执行之前,永远都不会关闭基础文件句柄。

高分回答:

看这个博客:

Java逐行读取文件-Java教程

可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

// 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来进行传输

juejin.cn/post/696248…

我参考了mmap + FileChannel的相关测试,发现会更好。

图片.png

可以看到,FileChannel的性能是比较高的。

简单说一下,就拿比较火热的rocketMQ来说,它是文件系统来存储数据的,生产和消费数据都是直接操作的文件,它会涉及到页缓存、FileChannel、FileChannel一次性读取1页4kb的数据,高性能得益于ByteBuffer 缓冲区、MMAP内存映射

RokcetMQ为了更好的性能也进行了调优

预分配MappedFile
mlock系统调用
文件预热
顺序读、顺序写

我这里只是进行一个抛砖引玉,大家加油!

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️