8.1 文本文件 I/O 与 Path
文件可以持久保存数据。内存中的变量会在程序结束后消失,但写入文件的数据可以保留下来。文件 I/O 指的就是从文件输入数据、向文件输出数据。
Java 有好几套文件 API。对现代初学代码来说,最值得先掌握的是 java.nio.file.Path 和 java.nio.file.Files。
Path 与 Files
Path 表示文件或目录的位置。Files 提供大量静态方法,用来读取、写入、复制、移动、删除和检查路径。
java
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
public class ReadWholeFileDemo {
public static void main(String[] args) throws IOException {
Path path = Path.of("notes.txt");
String content = Files.readString(path, StandardCharsets.UTF_8);
System.out.println(content);
}
}Path.of("notes.txt") 不会读取文件,它只是创建一个路径对象。真正打开文件、读取字节、按 UTF-8 解码、关闭文件并返回字符串的是 Files.readString(...)。
注意
Java 还有较早的
java.io.File 类。你仍然会在旧代码里看到它,但新代码通常用 Path 和 Files 更清楚。正在加载概念检查...
读取小型文本文件
对小文件来说,Files.readString() 很方便,因为它会一次性返回整个文件内容。
java
Path path = Path.of("quote.txt");
String text = Files.readString(path, StandardCharsets.UTF_8);
System.out.println(text);如果你想把所有行读成一个列表,可以用 Files.readAllLines()。
java
import java.util.List;
Path path = Path.of("quote.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
for (int i = 0; i < lines.size(); i++) {
System.out.println((i + 1) + ": " + lines.get(i));
}当文件很小、可以放心一次放进内存时,可以使用这些方法。如果文件可能很大,应优先使用逐行读取,8.2 会继续讲。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
IOException
文件操作可能因为程序外部的原因失败:文件不存在、路径指向目录、没有访问权限,或者磁盘不可用。很多 Java 文件方法都会抛出 IOException,它是受检异常(checked exception)。
受检异常必须被处理或声明。在小型演示程序里,可以在 main 上写 throws IOException:
java
public static void main(String[] args) throws IOException {
String text = Files.readString(Path.of("notes.txt"), StandardCharsets.UTF_8);
System.out.println(text);
}在面向用户的程序里,通常会捕获异常并打印有帮助的提示:
java
try {
String text = Files.readString(Path.of("notes.txt"), StandardCharsets.UTF_8);
System.out.println(text);
} catch (IOException error) {
System.out.println("无法读取 notes.txt:" + error.getMessage());
}重点不是“永远 catch”或“永远 throws”,而是决定程序在哪里能做出有意义的响应。
正在加载概念检查...