You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:36:00