可通过OutputStreamWriter构造函数传入自定义CharsetEncoder并设置onUnmappableCharacter/onMalformedInput策略来控制编码错误行为,支持REPLACE、IGNORE、REPORT三种模式,需用new OutputStreamWriter(out, encoder)方式构造,替换字节需符合目标字符集最大长度限制。

可以通过 OutputStreamWriter 的构造函数传入自定义的 CharsetEncoder,并提前设置其 onUnmappableCharacter 和 onMalformedInput 处理策略来控制无法编码字符时的行为。
使用 CharsetEncoder 显式配置替换策略
Java 的 CharsetEncoder 提供了两种错误处理模式:CodingErrorAction.REPLACE(用替换字符如 ? 代替)、CodingErrorAction.IGNORE(跳过非法字符)和 CodingErrorAction.REPORT(抛异常)。你需要先获取编码器,设置策略,再传给 OutputStreamWriter:
- 调用
Charset.forName("UTF-8").newEncoder()获取 encoder 实例 - 调用
encoder.onUnmappableCharacter(CodingErrorAction.REPLACE)设置无法映射字符的处理方式 - 调用
encoder.onMalformedInput(CodingErrorAction.REPLACE)设置格式错误输入的处理方式(如非法 UTF-8 字节序列) - 将该 encoder 传入
OutputStreamWriter(OutputStream, CharsetEncoder)构造函数
注意 OutputStreamWriter 构造方式的限制
OutputStreamWriter 有两个与编码器相关的构造方法,但只有带 CharsetEncoder 参数的那个支持自定义策略:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确用法:
new OutputStreamWriter(out, encoder) - ❌ 错误用法:
new OutputStreamWriter(out, "UTF-8")或new OutputStreamWriter(out, Charset.forName("UTF-8"))—— 这些会创建默认 encoder,无法修改错误策略
常见替换字符与自定义替换字节
默认替换字符是 ?(U+003F),对应单字节 0x3F。若需其他替换内容(比如空字符串或特定字节序列),可配合 CharsetEncoder.replaceWith(byte[]):
立即学习“Java免费学习笔记(深入)”;
- 例如:用 ASCII 空格替代
encoder.replaceWith(new byte[]{0x20}) - 注意:替换字节数不能超过目标 charset 单个字符的最大字节数(如 UTF-8 最多 4 字节)
- 若替换内容本身无法被编码,encoder 会回退到
REPORT行为并抛出CharacterCodingException
实际写入时的异常捕获建议
即使设置了 REPLACE 或 IGNORE,某些极端情况(如替换内容不合法)仍可能抛出 CharacterCodingException。建议在写入关键数据时做兜底处理:
- 对
write()、flush()、close()操作包裹 try-catch - 捕获
IOException(其子类包含CharacterCodingException) - 避免因单个坏字符导致整个输出流中断

















