outputstreamwriter需显式指定编码,推荐用standardcharsets.utf_8等charset常量;若用字符串编码名须捕获unsupportedencodingexception;禁用无参构造以防平台默认编码导致乱码。

在 Java 中,OutputStreamWriter 本身不直接“指定编码”,而是通过构造时传入 Charset 或编码名称字符串来关联字符编码。关键在于:**必须显式指定编码,否则会使用平台默认编码(不可靠)**。
用 Charset 对象指定编码(推荐)
这是类型安全、不易出错的方式,利用 StandardCharsets 中的常量:
-
StandardCharsets.UTF_8—— 最常用,兼容性好 -
StandardCharsets.ISO_8859_1—— 单字节编码,适合某些协议或旧系统 -
StandardCharsets.US_ASCII—— 严格 7 位 ASCII
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
用编码名称字符串指定(需处理异常)
传入字符串如 "UTF-8"、"GBK"、"Big5" 等,但会抛出 UnsupportedEncodingException,必须捕获或声明:
OutputStreamWriter writer = new OutputStreamWriter(
new FileOutputStream("note.txt"), "GBK"
);
} catch (UnsupportedEncodingException e) {
// 编码名错误或 JVM 不支持该编码
}
避免踩坑的要点
- 不要依赖无参构造方法:
new OutputStreamWriter(out)用的是Charset.defaultCharset(),不同机器结果可能不同 - 写中文、日文等非 ASCII 内容时,必须显式指定 UTF-8 或对应本地编码,否则容易乱码
- 如果目标是网络传输或跨平台文件,优先选
UTF-8;若对接 Windows 传统程序(如记事本未声明 BOM),有时需GBK - 配合
BufferedWriter提升性能:`new BufferedWriter(new OutputStreamWriter(out, UTF_8))`
验证编码是否生效的小技巧
写完后用十六进制查看器打开文件,确认开头是否有 UTF-8 的 BOM(可选,`\uFEFF` 对应 EF BB BF)或内容字节符合预期。例如写“你好”在 UTF-8 下是 E4 BD A0 E5 A5 BD,在 GBK 下是 C4 FA BA C3。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










