outputstreamwriter 用于将字符流按指定编码写入字节流,必须显式传入 charset(如 standardcharsets.utf_8)或编码名(如"utf-8"),避免使用默认平台编码;常配合 fileoutputstream 写文件,需注意编码一致性、异常处理及单向编码特性。

Java 中用 OutputStreamWriter 将字符转为字节流,本质是把 Writer(字符流)桥接到 OutputStream(字节流),并在写入时按指定编码将字符编码成字节。关键在于传入正确的字符集(Charset),否则默认使用平台编码,容易导致乱码。
指定编码创建 OutputStreamWriter
最常用的方式是通过构造函数传入 OutputStream 和 Charset 或编码名字符串:
- 用
Charset对象(推荐,类型安全):new OutputStreamWriter(outputStream, StandardCharsets.UTF_8) - 用编码名称字符串(注意拼写,大小写不敏感但建议全大写):
new OutputStreamWriter(outputStream, "UTF-8") - 不指定编码会使用
Charset.defaultCharset(),通常不可靠,应避免
配合 FileOutputStream 写入文件(典型场景)
这是最常见的需求:把字符串以指定编码写入文件:
- 先创建
FileOutputStream,再包装成OutputStreamWriter - 调用
write()写字符串,flush()强制输出,close()释放资源(建议用 try-with-resources) - 示例:
try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.GBK)) {<br> osw.write("你好,世界!");<br>}
此时文件内容将以 GBK 编码保存,用支持 GBK 的编辑器打开才不会乱码
注意编码一致性与异常处理
OutputStreamWriter 在写入无法被目标编码表示的字符时,会抛出 IOException(如用 ISO-8859-1 写中文):
- 捕获
IOException并合理处理(如记录日志、提示用户) - 确认目标编码是否支持待写字符:UTF-8 支持所有 Unicode 字符;GBK/GB2312 支持简体中文;ISO-8859-1 仅支持拉丁字母
- 可选地自定义编码失败策略(需用
CharsetEncoder构造更复杂的OutputStreamWriter,一般场景不需)
不要混淆:OutputStreamWriter 不是“转换已有字节流”
它不读取或修改已有的字节流,而是把字符“编码后写入”到字节流中:
- 错误理解:“用它把 UTF-8 字节数组转成 GBK 字节” → 这不是它的职责
- 正确流程:若已有字节数组(如 UTF-8 编码),应先用
InputStream+InputStreamReader解码为字符串,再用OutputStreamWriter重新编码写出 - 简单说:
OutputStreamWriter = 字符 → 指定编码字节,单向过程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











