Java使用FileInputStream.read()打印文件内容出现乱码是什么原因
问题根源
FileInputStream的read()方法每执行一次,就会从流中读取1个字节,同时将文件指针向后移动1位。你的代码在while判断条件中执行了一次read(),读到的字节直接丢弃没有保存,循环体中又执行了一次read()读取下一个字节,相当于每2个字节仅保留第二个,跳过了所有奇数位置的字节。- 乱码的核心原因是编码规则被破坏:除了ASCII这类单字节编码外,常用的UTF-8(1-4字节可变长)、GBK(2字节)等文本编码都要求连续的特定数量字节才能对应一个有效字符。字节序列被你随机截断后,剩余的字节完全不符合编码规则,解码时就会生成大量不可识别的乱码。比如一个UTF-8编码的汉字需要3个字节存储,跳过第一个字节后,剩下的2个字节无法正常解码,只会显示为乱码。
- 边界场景也会加重乱码:如果文件总字节数为奇数,最后一轮while判断会读到最后1个字节(不等于-1),进入循环体后再次调用
read()会读到流末尾标记-1,将-1强转为char类型会得到无效字符,也属于乱码的一部分。
正确逻辑说明
教程中的写法将每次read()得到的字节先存储到character变量中,先判断是否为流末尾标记-1,确认不是末尾后直接输出已经读取到的字节,不会出现字节丢失,完整的字节序列解码自然不会出现乱码:
System.out.println("File contents: "); int character; while((character=fileinputstream.read())!=-1) { System.out.print((char)character); } fileinputstream.close();
内容的提问来源于stack exchange,提问作者Nuan56
相关产品推荐
相关产品推荐

