outputstreamwriter必须在构造时指定编码,推荐用standardcharsets或charset.forname()传charset对象;不可创建后修改,禁用无参构造或setencoding()。

在 Java 中,OutputStreamWriter 通过构造函数指定字符编码,这是设置编码的唯一标准方式。不能创建后再修改编码,必须在初始化时明确传入。
使用带 Charset 对象的构造函数(推荐)
这是类型安全、不易出错的方式,利用 StandardCharsets 或 Charset.forName() 获取编码对象:
new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)new OutputStreamWriter(outputStream, Charset.forName("GBK"))-
new OutputStreamWriter(outputStream, Charset.defaultCharset())(不推荐,依赖系统默认)
使用带 字符集名称字符串 的构造函数
直接传入编码名字符串,但需注意运行时可能抛出 UnsupportedEncodingException:
new OutputStreamWriter(outputStream, "UTF-8")new OutputStreamWriter(outputStream, "ISO-8859-1")- 务必用 try-catch 包裹,或声明该异常(Java 早期版本要求)
常见误区提醒
以下做法无效或危险:
- 调用
setEncoding()——OutputStreamWriter没有这个方法 - 只传
OutputStream构造(无编码参数)—— 使用平台默认编码,跨环境易乱码 - 写入前临时切换系统默认编码(如改
file.encoding)—— 不可控且影响全局
完整示例(UTF-8 写文件)
(配合 FileOutputStream 使用)
try (FileOutputStream fos = new FileOutputStream("data.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
osw.write("你好,世界!");
}
这样可确保文件以 UTF-8 正确保存,避免中文乱码。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











