Java使用BufferedReader读文件出现交替空字节 编码问题咨询
问题原因
- 核心问题是读取文件时未指定正确的字符编码,输入文件本身是UTF-16系列编码(UTF-16LE/UTF-16BE,常见于Windows系统生成的文件),每个字符占2字节存储,ASCII范围内的字符高位字节为
0x00。你初始化InputStreamReader时没有传入编码参数,会默认使用操作系统的默认编码(通常是UTF-8或GBK)按单字节解码,导致原本的0x00字节被解码为空字符,和正常字符交替出现。 - 你之前尝试的事后转码方案无效,因为读取阶段已经用错误编码把二进制数据转成了损坏的字符串,数据丢失已经发生,后续转码无法修复。
解决方法
- 先确认输入文件的实际编码:可以用文本编辑器(如Notepad++)打开文件,查看底部状态栏显示的编码,常见场景为
UTF-16LE或带BOM的UTF-16 - 初始化
InputStreamReader时明确指定匹配的编码,示例代码如下:
// 如果是UTF-16LE编码 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream( cmdLnArgs[0] ), "UTF-16LE")); // 如果是带BOM的UTF-16,直接指定UTF-16即可自动识别大小端 // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream( cmdLnArgs[0] ), "UTF-16"));
- 验证规则:如果无法通过编辑器查看编码,可以读取文件前2-3个字节判断:
- 开头为
FF FE:UTF-16LE - 开头为
FE FF:UTF-16BE - 开头为
EF BB BF:UTF-8带BOM
- 开头为
内容的提问来源于stack exchange,提问作者james_t
相关产品推荐
相关产品推荐

