1. 概述
本文将介绍几种在 Java 中向文件追加数据的常用方法。这些方法从核心 Java API 到第三方库都有覆盖,适用于不同场景。我们将从最基础的 FileWriter
开始,逐步介绍更现代的实现方式。
2. 使用 FileWriter
FileWriter
是 Java 中操作文件的基础类,通过其构造函数的布尔参数可以控制是否追加数据:
@Test
public void 当使用FileWriter追加文件时_应正确追加内容()
throws IOException {
FileWriter fw = new FileWriter(fileName, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("Spain");
bw.newLine();
bw.close();
assertThat(getStringFromInputStream(
new FileInputStream(fileName)))
.isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
}
⚠️ 关键点:
- 构造函数第二个参数
true
表示追加模式 - 如果设置为
false
,则会覆盖原有文件内容
3. 使用 FileOutputStream
对于二进制文件操作,FileOutputStream
是更合适的选择:
@Test
public void 当使用FileOutputStream追加文件时_应正确追加内容()
throws Exception {
FileOutputStream fos = new FileOutputStream(fileName, true);
fos.write("Spain\r\n".getBytes());
fos.close();
assertThat(StreamUtils.getStringFromInputStream(
new FileInputStream(fileName)))
.isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
}
✅ 优势:
- 直接操作字节流,适合二进制数据
- 同样通过构造函数的布尔参数控制追加模式
4. 使用 java.nio.file
Java 7 引入的 NIO.2 提供了更现代的文件操作方式:
@Test
public void 当使用Files类追加文件时_应正确追加内容()
throws IOException {
String contentToAppend = "Spain\r\n";
Files.write(
Paths.get(fileName),
contentToAppend.getBytes(),
StandardOpenOption.APPEND);
assertThat(StreamUtils.getStringFromInputStream(
new FileInputStream(fileName)))
.isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
}
🔧 特点:
- 使用
StandardOpenOption.APPEND
明确指定追加模式 - 代码更简洁,异常处理更现代化
5. 使用 Guava
Google Guava 库提供了更优雅的文件操作方式。首先添加依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
然后使用 CharSink
进行追加操作:
@Test
public void 当使用Guava追加文件时_应正确追加内容()
throws IOException {
File file = new File(fileName);
CharSink chs = Files.asCharSink(
file, Charsets.UTF_8, FileWriteMode.APPEND);
chs.write("Spain\r\n");
assertThat(StreamUtils.getStringFromInputStream(
new FileInputStream(fileName)))
.isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
}
💡 优点:
- 链式调用更符合现代编程风格
- 自动处理字符编码和异常
6. 使用 Apache Commons IO
Apache Commons IO 的 FileUtils
提供了最简单的追加方式。先添加依赖:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
然后直接调用静态方法:
@Test
public void 当使用CommonsIO追加文件时_应正确追加内容()
throws IOException {
File file = new File(fileName);
FileUtils.writeStringToFile(
file, "Spain\r\n", StandardCharsets.UTF_8, true);
assertThat(StreamUtils.getStringFromInputStream(
new FileInputStream(fileName)))
.isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n");
}
🚀 优势:
- 一行代码完成追加操作
- 自动处理文件关闭和异常
7. 总结
本文介绍了六种向文件追加数据的方法,各具特点:
✅ 核心 Java 方案:
FileWriter
:适合简单文本追加FileOutputStream
:适合二进制数据java.nio.file
:现代且功能强大
✅ 第三方库方案:
- Guava:API 设计优雅
- Apache Commons IO:极致简洁
选择建议:
- 简单需求用
Files.write()
(NIO.2) - 复杂项目用 Guava 或 Commons IO
- 避免踩坑:务必注意追加模式的布尔参数!
完整示例代码可在 GitHub 查看。