文章目录
- [419. 现代 Java IO 最佳实践 - 写入文本文件](#419. 现代 Java IO 最佳实践 - 写入文本文件)
-
- [1. 📄 写入单个字符串](#1. 📄 写入单个字符串)
- [2. 📑 写入多行文本](#2. 📑 写入多行文本)
- [3. 🖨 使用 PrintWriter(格式化输出)](#3. 🖨 使用 PrintWriter(格式化输出))
-
- [🔎 注意:](#🔎 注意:)
- [4. 📝 使用 BufferedWriter(逐行写)](#4. 📝 使用 BufferedWriter(逐行写))
-
- [✅ 特点:](#✅ 特点:)
- [5. 🎓 总结](#5. 🎓 总结)
- [🔥 课堂练习建议](#🔥 课堂练习建议)
419. 现代 Java IO 最佳实践 - 写入文本文件
在应用开发中,写入文本文件是一个非常常见的操作。现代 Java(尤其是 java.nio.file.Files API)已经把它简化到"一行代码"的程度。
1. 📄 写入单个字符串
如果我们要写入整个字符串,可以直接用:
java
String content = "Hello Java I/O!";
Path path = Path.of("output.txt");
Files.writeString(path, content);
✅ 特点:
- 一行搞定,非常简洁。
- 会覆盖已有文件(默认行为)。
👉 如果想在文件末尾追加内容,可以指定选项:
java
Files.writeString(path, "追加的一行\n", StandardOpenOption.APPEND);
2. 📑 写入多行文本
当我们有一个 行列表 时,可以直接写入:
java
List<String> lines = List.of("第一行", "第二行", "第三行");
Files.write(Path.of("lines.txt"), lines);
效果就是每个元素写一行。
3. 🖨 使用 PrintWriter(格式化输出)
有时我们需要 格式化输出(例如 printf)。
java
String name = "Alice";
int age = 29;
try (var writer = new PrintWriter(Path.of("person.txt").toFile())) {
writer.printf(Locale.US, "Hello, %s, next year you'll be %d years old!%n", name, age + 1);
}
🔎 注意:
printf是 与 Locale(本地化)相关 的。Locale.US会用点号作为小数点。Locale.GERMANY会用逗号作为小数点。
- 如果不想依赖 Locale,推荐使用:
Integer.toString()Double.toString()- 或
NumberFormat
👉 ⚠️ 奇怪的是,直到 Java 21,PrintWriter 还没有直接接受 Path 的构造方法 ,所以需要先 .toFile()。
4. 📝 使用 BufferedWriter(逐行写)
如果不用 printf,可以用 BufferedWriter:
java
try (var writer = Files.newBufferedWriter(Path.of("buffered.txt"))) {
writer.write("第一行");
writer.newLine(); // 手动写入换行符
writer.write("第二行");
}
✅ 特点:
- 更灵活,可以逐行控制输出。
- 写入时需要手动调用
newLine(),否则不会自动换行。 try-with-resources会自动关闭 writer。
5. 🎓 总结
| 写法 | 适用场景 | 示例 |
|---|---|---|
Files.writeString |
写入单个字符串 | Files.writeString(path, content); |
Files.write |
写入多行 | Files.write(path, lines); |
PrintWriter.printf |
格式化输出 | writer.printf(Locale.US, "...", name, age); |
BufferedWriter |
灵活逐行写 | writer.write(...); writer.newLine(); |
🔥 课堂练习建议
- 让学员写一个程序,把控制台输入的内容逐行写入文件(直到输入 "exit" 为止)。
- 用
Files.writeString实现一个简单的日志追加写入功能。 - 比较
printf和NumberFormat在不同 Locale 下的输出差异。