使用OutputStreamWriter写入文件需显式指定UTF-8等编码,推荐StandardCharsets.UTF_8;配合FileOutputStream并用try-with-resources自动关闭与刷新,避免乱码和内容不全。

使用 OutputStreamWriter 向指定编码的文件写入内容,关键在于正确包装底层字节流(如 FileOutputStream),并在构造时显式传入字符编码名称(如 "UTF-8")。它负责将字符转换为对应编码的字节序列,避免乱码。
确保编码参数正确传递
OutputStreamWriter 的编码必须通过其带 Charset 或 String charsetName 的构造方法指定。若不指定,将使用平台默认编码,极易导致跨环境写入乱码。
- 推荐用
StandardCharsets.UTF_8(Java 7+):类型安全、无拼写错误风险 - 也可用字符串
"UTF-8",但需确保名称符合java.nio.charset.Charset规范(如"GBK"、"ISO-8859-1") - 避免使用已废弃的
new OutputStreamWriter(foStream, "UTF8")(缺少短横线)
配合 FileOutputStream 创建带编码的写入器
先创建 FileOutputStream 指向目标文件,再将其作为 OutputStreamWriter 的源流。注意关闭顺序:外层(Writer)关闭会自动触发内层(Stream)关闭(前提是未被包装多次)。
try (FileOutputStream fos = new FileOutputStream("data.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
osw.write("你好,世界!\n");
osw.write("Hello, World!");
}
上面代码确保所有中文和英文均以 UTF-8 编码写入文件,用文本编辑器以 UTF-8 打开即可正常显示。
写入后务必刷新或关闭
OutputStreamWriter 内部有缓冲区,直接写入不一定立即落盘。调用 flush() 强制输出,或依赖 try-with-resources 自动调用 close()(隐含 flush)。
- 手动管理时:写完调用
osw.flush(),再调用osw.close() - 推荐用 try-with-resources:自动完成 flush + close,更安全简洁
- 不关闭或不刷新可能导致文件内容不全或乱码(尤其程序异常退出时)
处理编码不可用的异常
若传入非法编码名(如 "UTF9"),构造 OutputStreamWriter 时会抛出 UnsupportedEncodingException。建议捕获并提示明确错误,而不是忽略。
try {
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("out.txt"), "UTF-8");
// ...
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("不支持的编码: UTF-8", e);
}
实际项目中,优先使用 StandardCharsets 常量可完全规避该异常。

















