用Java读取纯文本文件? 推荐 | Java Debug 笔记

251 阅读2分钟

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

用Java读取纯文本文件?

似乎有多种方法可以读取和写入Java中的文件数据。

我想从文件中读取ASCII数据。有哪些可能的方法及其区别?

高分回答:

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

ASCII是一个TEXT文件,因此您将Readers用于读取。Java还支持使用读取二进制文件InputStreams。如果正在读取的文件很大,那么您可能希望在aBufferedReader上使用aFileReader来提高读取性能。

仔细阅读本文,了解如何使用Reader

我还建议您下载并阅读这本名为《Thinking In Java》的精彩(尚未免费)的书。

在Java 7中:

new String(Files.readAllBytes(...))

(docs)或

Files.readAllLines(...)

在Java 8中:

Files.lines(..).forEach(...)

高分回答:

我最喜欢的读取小文件的方法是使用BufferedReader和StringBuilder。它非常简单而且很关键(尽管不是特别有效,但是对于大多数情况来说已经足够了):

BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
} finally {
    br.close();
}

有人指出,在Java 7之后,您应该使用try-with-resources(即自动关闭)功能:

try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while (line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
}

当我读取这样的字符串时,无论如何我通常还是想对每行进行一些字符串处理,因此我继续进行此实现。

尽管如果我实际上只是想将文件读入字符串,我总是将Apache Commons IO与IOUtils.toString()方法一起使用。您可以在这里查看源代码:

www.docjar.com/html/api/or…

FileInputStream inputStream = new FileInputStream("foo.txt");
try {
    String everything = IOUtils.toString(inputStream);
} finally {
    inputStream.close();
}

使用Java 7甚至更简单:

try(FileInputStream inputStream = new FileInputStream("foo.txt")) {     
    String everything = IOUtils.toString(inputStream);
    // do something with everything string
}

文章翻译自 yl2gl72eozkinivz3vc6swkesy-ac4c6men2g7xr2a-translate.translate.goog/questions/4…

作者建议:之前讲了写入文件 如何创建文件并写入文件?

单线程下现在主流的复制方法有以下几种:

1、FileChannel

2、FileInputStream

3、BufferedOutputStream

4、BufferedReader

5、FileReader

现取单线程下最快的方法FileChannel 来做多线程处理

简单对比下写入:

image.png

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

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

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

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

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

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

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

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

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