读入一个已使用 utf-8 修改版格式编码的字符串。readutf
的常规协定是:该方法读取使用 utf-8 修改版格式编码的 unicode 字符串的表示形式;然后以 string
的形式返回此字符串。
首先,读取两个字节并按 readunsignedshort
方法的方式使用这两个字节构造一个无符号 16 位整数,使用的是网络字节顺序(无论当前设置的是哪种字节顺序)。该整数值被称为 utf 长度,它指定要读取的额外字节数。然后成组地将这些字节转换为字符。每组的长度根据该组第一个字节的值计算。紧跟在某个组后面的字节(如果有)是下一组的第一个字节。
如果组的第一个字节与位模式 0xxxxxxx
(其中 x
表示“可能为 0
或 1
”)匹配,则该组只有这一个字节。该字节被左侧补 0,转换成一个字符。
如果组的第一个字节与位模式 110xxxxx
匹配,则该组只由字节 a
和另一个字节 b
组成。如果没有字节 b
(因为字节 a
是要读取的最后一个字节),或者字节 b
与位模式 10xxxxxx
不匹配,则抛出 utfdataformatexception
。否则,将该组转换成字符:
(char)(((a& 0x1f) << 6) | (b & 0x3f))
如果组的第一个字节与位模式 1110xxxx
匹配,则该组由字节 a
和另外两个字节 b
和 c
组成。如果没有字节 c
(因为字节 a
是要读取的最后两个字节之一),或者字节 b
或字节 c
与位模式 10xxxxxx
不匹配,则抛出 utfdataformatexception
。否则,将该组转换成字符:
(char)(((a & 0x0f) << 12) | ((b & 0x3f) << 6) | (c & 0x3f))
如果组的第一个字节与模式 1111xxxx
或模式 10xxxxxx
匹配,则抛出 utfdataformatexception
。
如果在整个执行过程中的任意时间遇到文件结束标记,则抛出 eofexception
。
在通过此过程将每个组转换成字符后,按照从输入流中读取相应组的顺序,将这些字符收集在一起,形成一个 string
,然后该字符串将被返回。
忽略当前设置的字节顺序。
在进行读取前,流中的位偏移量被重置为 0。
注:在使用标准 utf-8 图像格式的实现中不应该使用此方法,因为此处使用的 utf-8 修改版与标准 utf-8 不兼容。
- 指定者:
- 接口
datainput
中的 readutf
- 指定者:
- 接口
imageinputstream
中的 readutf
- 返回:
- 从流中读取的 string。
- 抛出:
eofexception
- 如果此流在读取所有字节之前到达末尾。
utfdataformatexception
- 如果这些字节不表示一个有效的、utf-8 修改版编码的字符串。
ioexception
- 如果发生 i/o 错误。