Java 追加内容到文件

本文介绍如何在 Java 中向文件中追加内容

  1. FilesWriteString 追加数据(Java 11)
  2. Files.write 追加数据(Java 7)
  3. FileWriter.write 追加数据(Java 1.1)
  4. BufferedWriter 追加数据(Java 1.1)
  5. FileOutputStream 追加数据(Java 1.0)
  6. 第三方库

追加单行内容

Files.writeString ⭐️

使用 Java 11 新增 Files.writeString 方法追加一行数据到文件,这里指定允许的文件操作方式为创建(CREATE)和追加(APPEND),在文件不存在时会自动创建文件。

Path path = Paths.get("/Users/darcy/wdbyte/test1.txt");
Files.writeString(path, "line appendLineJava11",
                  StandardOpenOption.CREATE,
                  StandardOpenOption.APPEND);

Files.write ⭐️

使用 Java 7 新增的 Files 类,通过指定文件操作模式 StandardOpenOption.APPEND 来追加内容。

Path path = Paths.get("/Users/darcy/wdbyte/test1.txt");
// 写入一行数据
Files.write(path, "line append1".getBytes(StandardCharsets.UTF_8),
    StandardOpenOption.CREATE, StandardOpenOption.APPEND);
// 写入一个换行符
Files.write(path, System.lineSeparator().getBytes(StandardCharsets.UTF_8),
    StandardOpenOption.APPEND);

FileWriter.write

自 Java 1.1 开始就支持的文件写入方式,在构造 FileWriter 时传入 true 参数指定追加模式。

String path = "/Users/darcy/wdbyte/test1.txt";
try (FileWriter fileWriter = new FileWriter(path, true)) {
    fileWriter.write("line append2");
    fileWriter.write(System.lineSeparator());
}

BufferedWriter

同样自 Java 1.1 开始就支持的方式,使用 BufferedWriter 写入文件,其实还是通过构造 FileWrite 指定追加模式。

String path = "/Users/darcy/wdbyte/test1.txt";
try (FileWriter fileWriter = new FileWriter(path, true)) {
    BufferedWriter bw = new BufferedWriter(fileWriter);
    bw.write("line append3");
    bw.newLine();
}

FileOutputStream

自 Java 1.0 一来就支持的文件追加方式,同样在构造时通过第二个参数来确定追加模式。

String path = "/Users/darcy/wdbyte/test1.txt";
try (FileOutputStream fileOutputStream = new FileOutputStream(path, true)) {
    fileOutputStream.write("line append4".getBytes(StandardCharsets.UTF_8));
    fileOutputStream.write(System.lineSeparator().getBytes(StandardCharsets.UTF_8));
}

追加多行内容

Files.write ⭐️

自 java 8 开始使用 Files.write 可以向文件写入 List 多行内容,下面是一个示例。

Path path = Paths.get("/Users/darcy/wdbyte/test1.txt");
List<String> dataList = new ArrayList<>();
dataList.add("line1 appendLineJava8");
dataList.add("line2 appendLineJava8");
dataList.add("line3 appendLineJava8");

Files.write(path, dataList,
    StandardOpenOption.CREATE,
    StandardOpenOption.APPEND);

Files.write(path, System.lineSeparator().getBytes(StandardCharsets.UTF_8),
    StandardOpenOption.CREATE,
    StandardOpenOption.APPEND);

BufferedWriter

当然直接使用 FileWriter 或者 BufferedWriter 通过循环写入多行数据,是从 Java 1.1 开始就支持的方式,下面是一个示例。

String path = "/Users/darcy/wdbyte/test1.txt";
List<String> dataList = new ArrayList<>();
dataList.add("line1 appendLineList");
dataList.add("line2 appendLineList");
dataList.add("line3 appendLineList");

try (FileWriter fileWriter = new FileWriter(path, true)) {
    BufferedWriter bw = new BufferedWriter(fileWriter);
    for (String data : dataList) {
        bw.write(data);
        bw.newLine();
    }
}

第三方库

Apache Commons

如果引入第三方库如 apache commons 也可以方便的追加一行或者多行数据。

引入依赖:

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.15.1</version>
</dependency>

追加一行数据:

File file = new File("/Users/darcy/wdbyte/test1.txt");
String content = "hello commons io,appendByCommonsIo";
FileUtils.writeStringToFile(file, content, 
                            StandardCharsets.UTF_8, true);
FileUtils.writeStringToFile(file, System.lineSeparator(), 
                            StandardCharsets.UTF_8, true);

追加多行数据:

File file = new File("/Users/darcy/wdbyte/test1.txt");
List<String> dataList = new ArrayList<>();
dataList.add("line1 hello commons io,appendListByCommonsIo");
dataList.add("line2 hello commons io,appendListByCommonsIo");
dataList.add("line3 hello commons io,appendListByCommonsIo");
FileUtils.writeLines(file, dataList, true);

Google Guava

引入依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.1.3-jre</version>
</dependency>

追加一行数据:

// 创建File对象指向要追加内容的文件
File file = new File("/Users/darcy/wdbyte/test1.txt");
// 要追加的内容
String contentToAppend = "Hello, Guava!";
try {
    // 使用Guava的Files类以追加模式写入内容
    com.google.common.io.Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND)
        .write(contentToAppend);

    // 如果需要追加新行,可以使用下面的代码
    com.google.common.io.Files.asCharSink(file, Charsets.UTF_8, com.google.common.io.FileWriteMode.APPEND)
        .write(contentToAppend + System.lineSeparator());
    System.out.println("Content appended successfully.");
} catch (IOException e) {
    System.err.println("Error appending content to file: " + e.getMessage());
}

追加多行数据

// 创建File对象指向要追加内容的文件
File file = new File("/Users/darcy/wdbyte/test1.txt");

// 要追加的内容
List<String> dataList = new ArrayList<>();
dataList.add("line1 hello commons io,appendDataListByGuava");
dataList.add("line2 hello commons io,appendDataListByGuava");
dataList.add("line3 hello commons io,appendDataListByGuava");

try {
    // 使用Guava的Files类以追加模式写入内容
    com.google.common.io.Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND)
        .writeLines(dataList);

    System.out.println("Content appended successfully.");
} catch (IOException e) {
    System.err.println("Error appending content to file: " + e.getMessage());
}

一如既往,文章中代码存放在 Github.com/niumoo/javaNotes.