dis.readUTF()是如何确定读多少字节的?

来源:4-4 字节流之数据输入输出流

咖喱炒饭

2017-04-19 15:29

问题是在学Java的DataOutputStream/DataInputStream时想到的

String fileName = "dos.dat";
DataOutputStream dos = new DataOutputStream(new FileOutputStream(fileName));
DataInputStream dis  = new DataInputStream(new FileInputStream(fileName));

//分别以utf-8和utf-16be编码的方式写入两个"中国"
dos.writeUTF("中国");
dos.writeChars("中国");

//打印readUTF()读到的字符串
String s = dis.readUTF();
System.out.println(s);

文件传输基础——Java IO流 4-4课程中,老师演示的输出结果只打印了一个"中国"

疑问:

文件就是字节排列,

utf-8编码中,中文占3个字节

utf-16be编码中,中文占2个字节

readUTF()方法是如何确定要读几个字节的呢?

比如说,

假若字节排列为11 22 33 44 55 66 77 88 99 00

11 22 33组成utf-8的'中'

44 55 66组成utf-8的'国'

77 88组成utf-16be的'中'

99 00组成utf-16be的"国"

然而77 88 99也可组成utf-8的'不知是什么的中文'、或77组成'不知是什么的英文'

那么在将字节转为字符串的时候,read()方法是如何做到

中文对应的字节转为中文,而不是转为2个字母

非utf-8编码的字节比如utf-16be的字节排除,或停止,而不是继续读出来

底层代码花了很长世间却实在是看不懂,求大神解答

感谢。

写回答 关注

1回答

  • 慕粉2137351520
    2017-04-20 17:38:30

    尝试回答一下,首先是utf-16be编码中英文都是两个字节,那么就是根据指针两个两个字节编译;utf-8编码时中文占三个字节,英文占一个字节,设想一下,首先也是按照指针,应该有个先后编译顺序,假设英文优先,就是先尝试编译一个字节,若失败,则尝试编译三个字节,成功则编译成一个汉字,失败则编译成乱码,循环下去,当然实际情况可能复杂的多,编码的方式也就像是一个封装,不用考虑太多。

文件传输基础——Java IO流

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

133813 学习 · 1058 问题

查看课程

相似问题