求教 为什么byte数组长度设置的不同 比如设为2中文可能就是乱码问号,但是设置成1024 就是正常的

蓝海丶丶 2018-05-13 10:03:53
import java.io.FileInputStream;
import java.io.IOException;


public class InputStreamDemo {
public static void main(String[] args) throws IOException {
FileInputStream ins=new FileInputStream("d:\\新建文本文档.txt");
byte[] b=new byte[1024];
int len=0;

while((len=ins.read(b))!=-1) {

System.out.println(new String(b,0,len));
}
ins.close();
}
}
...全文
940 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcwtitxu 2018-05-18
  • 打赏
  • 举报
回复
安全的方式是使用 InputStreamReader, 按字符读,而不是按字节读

InputStreamReader reader = new InputStreamReader(new FileInputStream("d:\\新建文本文档.txt"), "GBK");
char[] c = new char[1024];
int len=0;
while((len=reader.read(c))!=-1) {
	System.out.println(new String(c, 0, len));
}
reader.close();
wcwtitxu 2018-05-18
  • 打赏
  • 举报
回复
1024 也不一定就没有乱码 可以做个假设,比如你文件内容是 "a哈", 按GBK编码存放,就是 "61(a) B9 FE(哈)", 共3字节, 汉字每个2字节 你循环第一次取2字节 就是 "61 B9" 循环第二次取到的是1字节 "FE" 分别 new String(new byte[]{ (byte)0x61, (byte)0xB9 }) // a? new String(new byte[]{ (byte)0xFE }) // ? 因为汉字的2字节在中间被打断,所以在这个场景下你就会得到内容 "a??", 而不是预期的 "a哈" 所以用1024长度的byte[]也是有可能刚好把汉字字节打断的,只不过概率降低了而已
qq_42231820 2018-05-17
  • 打赏
  • 举报
回复
因为一个汉字占3个字节,所以会出现乱码
yjsl__ 2018-05-14
  • 打赏
  • 举报
回复
读中文用字符流
  • 打赏
  • 举报
回复
引用 1 楼 lynmison 的回复:
中文汉字: 字节数 : 2;编码:GB2312 字节数 : 2;编码:GBK 字节数 : 2;编码:GB18030 字节数 : 1;编码:ISO-8859-1 字节数 : 3;编码:UTF-8 字节数 : 4;编码:UTF-16 字节数 : 2;编码:UTF-16BE 字节数 : 2;编码:UTF-16LE 如果byte数组长度为2,一个汉字可能被你拆分了。
同意。
天行归来 2018-05-13
  • 打赏
  • 举报
回复
中文汉字: 字节数 : 2;编码:GB2312 字节数 : 2;编码:GBK 字节数 : 2;编码:GB18030 字节数 : 1;编码:ISO-8859-1 字节数 : 3;编码:UTF-8 字节数 : 4;编码:UTF-16 字节数 : 2;编码:UTF-16BE 字节数 : 2;编码:UTF-16LE 如果byte数组长度为2,一个汉字可能被你拆分了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧