FileWriter.write() 不会立即保存字符串,因数据先写入缓冲区,必须显式调用 flush() 或 close() 才能落盘;推荐用 try-with-resources 确保自动 flush 和关闭;默认覆盖写入,追加需传 true;不支持指定编码,应改用 OutputStreamWriter + FileOutputStream 显式指定 Charset。

FileWriter.write() 不能直接“保存”字符串——它只写入缓冲区,不调用 close() 或 flush() 就不会落盘。
为什么写完文件内容却看不到?
常见现象是:程序运行无报错,但目标文件为空或内容缺失。根本原因是 FileWriter 内部使用缓冲区,write() 只把数据塞进缓冲区,不强制刷出。
-
write(String)和write(char[])都不自动刷新缓冲区 - JVM 退出时可能触发隐式 flush,但不可靠;程序中途崩溃或未 close,数据就丢了
- 即使手动调用
flush(),若后续没close(),仍存在资源泄漏风险
必须显式关闭或用 try-with-resources
最稳妥的方式是让 JVM 帮你确保关闭,而不是自己在 finally 里手写 close() —— 容易漏判 null 或嵌套异常。
- 推荐写法:
try (FileWriter writer = new FileWriter("output.txt")) { writer.write("Hello, world!"); } catch (IOException e) { e.printStackTrace(); } - 不用
flush():try-with-resources 的close()会自动 flush 并释放资源 - 如果不用 try-with-resources,必须配对
flush()+close(),且close()要放在finally块中
覆盖写入 vs 追加写入:构造参数决定行为
默认是覆盖模式,这点极易被忽略,尤其在日志、配置更新等场景下导致误删历史内容。
- 覆盖写入:
new FileWriter("data.txt")—— 文件存在则清空重写 - 追加写入:
new FileWriter("data.txt", true)—— 光标移到末尾,append 模式 - 注意:第二个参数是
boolean append,不是编码或别的 flag,传错类型会编译失败
编码问题:FileWriter 不支持指定字符集
如果你写中文、emoji 或非系统默认编码(如 UTF-8)的文本,FileWriter 会用 Charset.defaultCharset(),Windows 上常是 GBK,Linux/macOS 是 UTF-8 —— 跨平台极易乱码。
- 解决办法:不用
FileWriter,改用OutputStreamWriter+FileOutputStream,显式指定编码:try (OutputStreamWriter writer = new OutputStreamWriter( new FileOutputStream("utf8.txt"), StandardCharsets.UTF_8)) { writer.write("你好,世界!"); } -
FileWriter没有接受Charset的构造方法,强行绕过会导致不可移植行为
真正麻烦的不是怎么写那行 write(),而是关不关、怎么关、按什么编码关——这三点漏掉任意一个,都可能让程序在某台机器上静默失败。

















