读取和写入文本文件
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 日