java.io.DataOutputStream.writeUTF(String str)
方法存在一个奇怪的限制,它将utf-8编码字符串的大小限制为65535
个字节:
if (utflen > 65535)
throw new UTFDataFormatException(
"encoded string too long: " + utflen + " bytes");
很奇怪,因为:
static int writeUTF(String str, DataOutput out)
方法可以轻松解决此限制java.io.DataInputStream.readUTF()
没有这样的限制。根据上文,我无法理解writeUTF
方法中此类限制的目的。我错过了什么或误解了什么?
答案 0 :(得分:11)
Javadoc of DataOutputStream.writeUTF
州:
首先,将两个字节写入输出流,就好像通过
writeShort
方法给出要遵循的字节数。这个值 是实际写出的字节数,而不是长度 字符串。
两个字节表示16位:在16位中,可以编码的最大整数是2^16
== 65535。
DataInputStream.readUTF
具有完全相同的限制,因为它首先读取要使用的UTF-8字节数,以2字节整数的形式,最多只能有65535。
writeUTF
首先写入两个长度的字节,其结果与调用writeShort
的长度相同,然后写入UTF编码的字节。 writeUTF
实际上并不调用writeShort
- 它会构建一个具有2字节长度和UTF字节的byte[]
。但这就是为什么Javadoc用“writeShort
方法”而不是“通过writeShort
方法”说“好像”。