Files.writeString() 配合 StandardOpenOption.APPEND 和 CREATE 可安全追加日志,需手动添加 System.lineSeparator() 换行,多线程需同步,且必须捕获 IOException。

直接用 Files.writeString() 配合 StandardOpenOption.APPEND 可以安全、简洁地向文件末尾追加日志,无需手动管理流或处理换行。
确保使用正确的参数组合
Files.writeString() 默认会覆盖文件内容。要实现追加,必须显式传入 StandardOpenOption.APPEND,并且通常还需加上 StandardOpenOption.CREATE(文件不存在时自动创建):
-
StandardOpenOption.APPEND:定位到文件末尾写入,不覆盖原有内容 -
StandardOpenOption.CREATE:若文件不存在,自动创建(否则抛出 NoSuchFileException) - 可选添加
StandardOpenOption.WRITE(writeString 内部已隐含,一般不用显式写)
注意换行与编码问题
该方法默认使用 UTF-8 编码,适合大多数日志场景;但不会自动添加换行符 —— 这意味着你需要自己拼接 "\n" 或 System.lineSeparator():
- 推荐用
System.lineSeparator(),兼容 Windows/Linux/macOS 换行习惯 - 例如:
Files.writeString(path, "[INFO] Start" + System.lineSeparator(), StandardOpenOption.CREATE, StandardOpenOption.APPEND) - 如果连续多次调用,每次都要自己加换行,否则所有日志会挤在一行
避免并发写入冲突
Files.writeString() 是原子操作,但仅限单次写入。多线程同时追加同一文件时,仍可能出现内容交错(如两行日志被切开混在一起):
立即学习“Java免费学习笔记(深入)”;
- 简单应用可用
synchronized块或ReentrantLock控制写入临界区 - 生产环境建议改用
java.util.logging、Log4j 或 SLF4J + Logback 等成熟日志框架,它们内置了线程安全的文件追加器(如RollingFileAppender) - 若坚持手写,可封装一个静态同步方法统一处理日志写入
异常处理不可省略
该方法可能抛出 IOException(如磁盘满、权限不足、路径非法),必须捕获并妥善处理:
- 记录错误本身(可用
System.err.println()或备用日志方式) - 避免因日志失败导致主业务中断,除非是关键审计日志
- 示例中不要忽略异常,也不要只写
e.printStackTrace()到控制台


















