charsetdecoder分段解码需严格三步:先reset()清状态,再decode(input,output,endofinput)转换,最后flush(output)处理残留;endofinput为true时才校验完整性,false允许不完整字节;须依coderresult响应underflow/overflow,并预设replace或ignore容错策略。

处理大字符流时,CharsetDecoder.decode 不适合一次性解码全部数据,必须分段进行。核心在于保持解码器状态连续、正确管理缓冲区边界、并妥善应对截断字节序列。
分段解码的三步固定流程
每次处理一块字节数据,都需严格按顺序执行:
- reset():复用解码器前必须调用,清空内部状态(如未完成的 UTF-8 多字节头)
- decode(input, output, endOfInput):主转换逻辑;input 是当前字节块,output 是目标字符缓冲区,endOfInput 标识是否为最后一块
- flush(output):所有 decode 调用结束后必须调用,把残留中间状态(如半个汉字、未闭合的代理对)转为有效字符
endOfInput 参数的关键作用
这个布尔值决定解码器是否允许“等待更多输入”。设为 false 时,遇到不完整字节(如 GBK 中只剩一个字节、UTF-8 中只剩首字节 0xE4)会返回 CoderResult.UNDERFLOW,不报错;设为 true 后再遇同样情况,就会抛 MalformedInputException。
- 网络接收循环中:前 N−1 次传 false
- 读到 EOF 或明确无后续数据时:最后一次传 true
- 误将中间块设为 true,是 MalformedInputException 的常见原因
缓冲区管理与 CoderResult 响应
decode() 返回结果不是布尔值,而是 CoderResult,需主动判断:
- UNDERFLOW:输入已读完,但还有空间可写——本次解码结束,可继续下一段
- OVERFLOW:output 缓冲区满了——需先读走已解出的字符(flip + get),再 compact 继续写入
- ERROR:发生非法或不可映射字节——按预设策略处理(REPLACE/IGNORE/REPORT),不抛异常
容错策略要提前设置
默认行为是严格报错,线上系统通常需放宽:
- decoder.onMalformedInput(CodingErrorAction.REPLACE):把非法字节序列替换成 (U+FFFD)
- decoder.onUnmappableCharacter(CodingErrorAction.IGNORE):跳过无法映射的字节(如 GBK 文件里混入了 UTF-8 特有字节)
- 调试阶段建议先用 REPORT,统计错误比例再决定上线策略










