FileWriter追加需显式传true,否则覆盖;中文应使用OutputStreamWriter指定UTF-8;多线程需加锁或改用Files.write。

FileWriter 构造函数第二个参数设为 true 才能追加
默认 FileWriter 会覆盖原文件,因为它的构造函数签名是 FileWriter(String fileName, boolean append),第二个参数不传或传 false 就清空重写。想追加必须显式传 true。
- 错误写法:
new FileWriter("log.txt")→ 每次都覆盖 - 正确写法:
new FileWriter("log.txt", true)→ 在末尾追加 - 如果文件不存在,无论是否追加模式,都会自动创建
用 try-with-resources 确保 close 不被遗漏
追加写入时若忘记 close(),缓冲区内容可能没刷到磁盘,尤其在程序异常退出时容易丢数据。Java 7+ 推荐用 try-with-resources 自动释放资源。
- 别手动调
fw.close(),容易漏在 catch 或 return 前 - 写成:
try (FileWriter fw = new FileWriter("data.txt", true)) { fw.write("new line\n"); } - 注意:
write()不自动换行,要自己加\n或\r\n
中文乱码?记得指定字符集用 OutputStreamWriter + FileOutputStream
FileWriter 是 Writer 子类,内部用平台默认编码(Windows 是 GBK),跨环境极易乱码。真要稳定写中文,绕过 FileWriter,改用带编码的组合。
- 问题现象:
FileWriter写“你好”在 Linux 上变成乱码 - 解决方式:
try (OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream("out.txt", true), "UTF-8")) { osw.write("你好\n"); } - 关键点:
FileOutputStream支持追加(第二个参数true),OutputStreamWriter负责编码转换
高并发写同一个文件?FileWriter 不安全,得加锁或换方案
FileWriter 本身不是线程安全的。多个线程同时 write() 同一个实例,可能写错位置、内容交叉甚至抛 IOException。
立即学习“Java免费学习笔记(深入)”;
- 单线程追加没问题;多线程共用一个
FileWriter实例一定出问题 - 简单加
synchronized块可缓解,但性能差,且不能防止不同 JVM 进程间冲突 - 生产环境更推荐:
java.nio.file.Files.write(..., StandardOpenOption.APPEND)配合StandardOpenOption.CREATE,底层更可控








