安全写入字符串需用try-with-resources自动关流和刷新,显式指定追加模式(true)避免覆盖,优先用outputstreamwriter+fileoutputstream指定utf-8编码防乱码。

用 FileWriter 安全写入字符串,核心是三点:自动关流、明确写入模式、避开编码陷阱。手动调 close 或 flush 容易遗漏,平台默认编码(如 Windows 的 GBK)又极易导致中文乱码——这些正是实际开发中最常踩的坑。
必须用 try-with-resources 管理生命周期
FileWriter 是系统资源,不及时关闭会导致文件句柄泄漏,甚至内容未真正落盘。try-with-resources 能保证无论正常执行还是抛异常,流都会被自动关闭和刷新。
- ✅ 正确写法(覆盖写入):
try (FileWriter fw = new FileWriter("data.txt")) {
fw.write("第一行内容\n");
fw.write("第二行内容");
} - ✅ 正确写法(追加写入):
try (FileWriter fw = new FileWriter("data.txt", true)) {
fw.write("新增日志时间:" + System.currentTimeMillis() + "\n");
} - ❌ 避免手写 close:单独调用 fw.close() 容易被异常跳过,且 forget 写是高频失误。
按需选择覆盖或追加模式
FileWriter 默认清空原文件重写。若要保留历史内容,必须显式传入 true 启用追加。
- 覆盖写入(默认):
new FileWriter("log.txt")→ 每次运行都从头开始,旧内容消失 - 追加写入:
new FileWriter("log.txt", true)→ 新内容自动加在末尾,适合日志、记录类场景 - 注意:追加模式下不会自动换行,需在字符串末尾手动加
"\n"
中文乱码?优先改用 OutputStreamWriter + FileOutputStream
FileWriter 自 Java 11 起虽支持 Charset 构造参数,但低版本仍受限,且多数项目需兼容 JDK 8。更稳妥的做法是绕过 FileWriter,直接组合底层字节流与编码控制。
- ✅ 强制 UTF-8 写入(推荐):
try (OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("utf8.txt"), StandardCharsets.UTF_8)) {
osw.write("你好,世界!");
} - ⚠️ FileWriter 的 getEncoding() 只能查当前编码,不能设;依赖平台默认值风险高
- 如果坚持用 FileWriter,请确认环境默认编码一致(例如 Linux 通常 UTF-8,Windows 常为 GBK),否则中文大概率显示为乱码
写入字符数组也一样安全
当已有 char[] 数据(比如从解析器拿到的原始字符缓冲区),可直接 write,无需转 String,减少对象创建开销。
-
fw.write(new char[]{'J', 'a', 'v', 'a'})→ 写入 "Java" -
fw.write(chars, 2, 3)→ 从索引 2 开始写入 3 个字符,适合截取子串场景 - 所有 write 方法在 try-with-resources 下同样受自动刷新和关闭保护
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











