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:极致简洁

选择建议:

  1. 简单需求用 Files.write() (NIO.2)
  2. 复杂项目用 Guava 或 Commons IO
  3. 避免踩坑:务必注意追加模式的布尔参数!

完整示例代码可在 GitHub 查看。


原始标题:Java – Append Data to a File