
本文详解如何利用 java.nio.file.files 正确合并两个文本文件的内容到一个新文件中,避免因默认覆盖模式导致数据丢失,并提供安全、可读的代码实现。
本文详解如何利用 java.nio.file.files 正确合并两个文本文件的内容到一个新文件中,避免因默认覆盖模式导致数据丢失,并提供安全、可读的代码实现。
在使用 Files.write() 合并多个文件内容时,一个常见误区是忽略其默认打开选项:CREATE + TRUNCATE_EXISTING。这意味着每次调用 Files.write() 都会清空目标文件并重写内容——因此第二个 write() 调用会完全覆盖第一个写入的结果,最终新文件仅保留 txt2.txt 的内容。
要实现真正的“追加写入”,必须显式指定 StandardOpenOption.APPEND。同时,首次写入时仍需确保文件存在(可配合 StandardOpenOption.CREATE),而后续写入则应启用追加模式。以下是修正后的完整示例:
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 FileMerger {
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");
// 确保目标文件存在(若不存在则创建)
if (!Files.exists(newFile)) {
Files.createFile(newFile);
}
// 读取并写入第一个文件(CREATE + WRITE,不追加)
List<String> lines1 = Files.readAllLines(file1, StandardCharsets.UTF_8);
Files.write(newFile, lines1, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
// 读取并追加写入第二个文件(APPEND 模式)
List<String> lines2 = Files.readAllLines(file2, StandardCharsets.UTF_8);
Files.write(newFile, lines2, StandardOpenOption.APPEND, StandardOpenOption.WRITE);
}
}✅ 关键要点说明:
- StandardOpenOption.CREATE:确保文件存在(若不存在则新建);
- StandardOpenOption.WRITE:必需,表示以写入模式打开;
- StandardOpenOption.APPEND:仅对第二次及之后的写入启用,保证内容接续而非覆盖;
- 显式指定 StandardCharsets.UTF_8 可避免平台默认编码不一致引发的乱码问题;
- 不建议重复调用 Files.createFile()(如原代码中 Files.createFile(File)),因为目标文件可能已存在,会抛出 FileAlreadyExistsException。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 若需在两段内容间添加分隔符(如空行),可在写入 lines1 后手动追加一行:
Files.write(newFile, List.of(""), StandardOpenOption.APPEND, StandardOpenOption.WRITE); - 对于超大文件,建议改用流式处理(如 Files.lines() + BufferedWriter),避免内存溢出。
通过合理组合 StandardOpenOption,即可精准控制文件写入行为,安全、高效地完成多源内容合并任务。


















