8.3 写入、追加与资源管理
写文件不只是“把文本放进去”。你需要决定是否创建新文件、是否覆盖旧内容、是否追加到末尾、是否创建缺失文件夹,以及如何可靠关闭资源。
写入小型文本文件
对短文本来说,Files.writeString() 是最简单的选择。
java
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
public class WriteStringDemo {
public static void main(String[] args) throws IOException {
Path path = Path.of("study_log.txt");
String text = String.join(System.lineSeparator(),
"今天我学习了 Path。",
"Files.writeString 可以写文本。",
"UTF-8 让文本更稳定。"
);
Files.writeString(path, text + System.lineSeparator(), StandardCharsets.UTF_8);
}
}默认情况下,Files.writeString() 会在文件不存在时创建文件;如果文件已经存在,它会替换原内容。替换行为适合生成全新的报告,但如果你本来想保留旧数据,就会很危险。
正在加载概念检查...
用 StandardOpenOption 追加
StandardOpenOption 可以明确告诉 Java 写入时应该怎么处理文件。
java
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
public class AppendDemo {
public static void main(String[] args) throws IOException {
Path path = Path.of("events.log");
Files.writeString(
path,
"程序启动" + System.lineSeparator(),
StandardCharsets.UTF_8,
StandardOpenOption.CREATE,
StandardOpenOption.APPEND
);
}
}常见选项:
CREATE:文件不存在时创建文件。CREATE_NEW:只在文件不存在时创建;如果已存在则失败。TRUNCATE_EXISTING:写入前清空旧内容。APPEND:把新内容写到文件末尾。
这些选项很重要,因为文件输出可能破坏数据。代码里应该明确写出“覆盖还是追加”的决定。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
BufferedWriter 与 PrintWriter
如果要写入很多小片段,BufferedWriter 高效而且明确。
java
try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
writer.write("Name,Score");
writer.newLine();
writer.write("Alice,92");
writer.newLine();
}当你想使用 print、println、printf 风格的方法时,PrintWriter 很方便。
java
try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(path, StandardCharsets.UTF_8))) {
writer.println("Name,Score");
writer.printf("%s,%d%n", "Alice", 92);
}更大的重点是资源生命周期。Writer 通常会先把数据放进缓冲区,再写入磁盘。关闭 writer 会把剩余数据刷新出去。try-with-resources 是最稳妥的习惯,因为即使异常打断代码块,它也会负责关闭资源。
正在加载概念检查...
正在加载本节练习...