系列中的上一篇
当前教程
读取和写入文本文件
系列中的下一篇

系列中的上一篇: 读取和写入小型文件

系列中的下一篇: 读取和写入二进制文件

读取和写入文本文件

The java.nio.file 包支持通道 I/O,它以缓冲区形式移动数据,绕过了一些可能导致流 I/O 出现瓶颈的层。

 

了解字符处理

Java 平台使用 Unicode 约定存储字符值。字符流 I/O 会自动将此内部格式转换为本地字符集,反之亦然。在西方语言环境中,本地字符集通常是 ASCII 或 UTF-8 的 8 位超集。

使用流类完成的输入和输出会自动转换为本地字符集,反之亦然。在 Java SE 17 之前,使用字符流的程序会自动适应本地字符集,并准备好进行国际化 - 所有这些都不需要程序员额外努力。从 Java SE 18 开始,Java 应用程序的默认字符集为 UTF-8。

如果国际化不是优先事项,您可以简单地使用字符流类,而无需过多关注字符集问题。稍后,如果国际化成为优先事项,您的程序可以在无需大量重新编码的情况下进行调整。

 

使用缓冲流 I/O 读取文本文件

The newBufferedReader(Path, Charset) 方法打开一个文件以供读取,返回一个 BufferedReader,该方法可用于以高效的方式从文件中读取文本。

BufferedReader 类为您提供了一种方法,可以逐行读取文本文件的内容。从 Java SE 8 开始,它还为您提供了一种方法,可以在文本文件行上创建 Stream<String>。您可以在本教程的 流部分 中了解有关流的更多信息。

以下代码逐行读取您的文件。

// The closing of the reader and the handling of the exceptions
// have been omitted
// String line = reader.readLine();
long count = 0L;
while (line != null) {
    count++;
    line = reader.readLine();
}
System.out.println("Number of lines in this file = " + count);

请注意,line 字符串不包含每行的行终止符。当文件末尾到达时,返回的行是 null

从 Java SE 8 开始,您可以编写以下代码。

Path path = Path.of("file.txt");

try (BufferedReader reader = Files.newBufferedReader(path);
     Stream<String> lines = reader.lines();) {

    long count = lines.count();
    System.out.println("count = " + count);
}

reader.lines() 方法在 BufferedReader 类中定义。由于 Stream 接口扩展了 AutoCloseable 接口,因此您可以在 try-with-resources 语句中打开流。在这种情况下,reader 会正确关闭。

 

使用缓冲流 I/O 写入文本文件

您可以使用 newBufferedWriter(Path, Charset, OpenOption...) 方法使用 BufferedWriter 写入文件。

以下代码片段展示了如何使用此方法创建以“US-ASCII”编码的文件

Charset charset = Charset.forName("US-ASCII");
String s = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file, charset)) {
    writer.write(s, 0, s.length());
} catch (IOException x) {
    System.err.format("IOException: %s%n", x);
}

上次更新: 2023 年 1 月 25 日


系列中的上一篇
当前教程
读取和写入文本文件
系列中的下一篇

系列中的上一篇: 读取和写入小型文件

系列中的下一篇: 读取和写入二进制文件