
本文详解如何利用 java.nio.file.files.write() 的标准打开选项(如 append)将多个源文件内容顺序写入同一目标文件,避免因默认覆盖模式导致数据丢失。
本文详解如何利用 java.nio.file.files.write() 的标准打开选项(如 append)将多个源文件内容顺序写入同一目标文件,避免因默认覆盖模式导致数据丢失。
在使用 java.nio.file.Files.write() 向文件写入内容时,默认行为是创建(或重用)文件并清空其原有内容——即隐式启用 StandardOpenOption.CREATE 和 StandardOpenOption.TRUNCATE_EXISTING。这正是原代码中 newFile 最终只保留 txt2.txt 内容的根本原因:第二次 Files.write() 覆盖了第一次写入的所有数据。
要实现“先写入文件1、再追加文件2”的效果,必须显式指定写入模式。关键在于:首次写入使用 CREATE(确保文件存在),后续写入则必须使用 APPEND 模式,以在文件末尾追加内容而非覆盖。
以下是修正后的完整示例代码:
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;
public class FileConcatenationExample {
public static void main(String[] args) throws IOException {
Path file1 = Paths.get("D:\sample\txt1.txt");
Path file2 = Paths.get("D:\sample\txt2.txt");
Path newFile = Paths.get("D:\sample\newFile.txt");
// 读取并写入第一个文件(CREATE 确保新建/清空后写入)
List<string> lines1 = Files.readAllLines(file1, StandardCharsets.UTF_8);
Files.write(newFile, lines1, StandardOpenOption.CREATE);
// 读取并追加第二个文件(APPEND 模式,不覆盖已有内容)
List<string> lines2 = Files.readAllLines(file2, StandardCharsets.UTF_8);
Files.write(newFile, lines2, StandardOpenOption.APPEND);
}
}</string></string>
✅ 关键说明与注意事项:
- StandardOpenOption.APPEND 会将内容追加到文件末尾,并自动换行(但不会在两段内容之间插入空行);若需分隔,可在写入前手动添加空行,例如:
lines2.add(0, ""); // 在 lines2 开头插入空行,实现段落分隔
- 建议显式指定字符集(如 StandardCharsets.UTF_8),避免平台默认编码不一致引发乱码;
- 若目标文件路径的父目录不存在,CREATE 不会自动创建目录,此时应提前调用 Files.createDirectories();
- 对于超大文件,逐行读取可能造成内存压力,生产环境推荐使用 Files.lines() 流式处理或 Files.copy() 配合通道操作。
综上,正确组合 StandardOpenOption 是控制文件写入行为的核心。牢记:覆盖是默认,追加需显式声明——这是 Java NIO 文件 I/O 的重要设计原则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











