协慌网

登录 贡献 社区

用 Java 读取纯文本文件

似乎有不同的方法来读取和写入 Java 中的文件数据。

我想从文件中读取 ASCII 数据。可能的方式和差异是什么?

答案

我最喜欢读取小文件的方法是使用 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();
}

当我读这样的字符串时,我通常想要每行执行一些字符串处理,所以我就去实现这个。

虽然如果我只想将文件读入 String,我总是使用 Apache Commons IO和类 IOUtils.toString()方法。您可以在这里查看来源:

http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html

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
}

ASCII 是一个 TEXT 文件,因此您可以使用Readers进行阅读。 Java 还支持使用InputStreams从二进制文件读取。如果要读取的文件很大,那么您可能希望在FileReader之上使用BufferedReader来提高读取性能。

通过去本文就如何使用Reader

我还建议你下载并阅读这本名为Thinking In Java 的精彩(但免费)的书

在 Java 7 中

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

(docs)

Files.readAllLines(...)

(文档)

在 Java 8 中

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

(文档)

最简单的方法是使用 Java 中的Scanner类和 FileReader 对象。简单的例子:

Scanner in = new Scanner(new FileReader("filename.txt"));

Scanner有几种读取字符串,数字等的方法...... 您可以在 Java 文档页面上查找有关此内容的更多信息。

例如,将整个内容读入String

StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
    sb.append(in.next());
}
in.close();
outString = sb.toString();

此外,如果您需要特定的编码,您可以使用它而不是FileReader

new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)