DataOutputStream:“编码字符串太长”限制的目的

时间:2014-03-30 07:44:55

标签: java restrictions dataoutputstream

java.io.DataOutputStream.writeUTF(String str)方法存在一个奇怪的限制,它将utf-8编码字符串的大小限制为65535个字节:

    if (utflen > 65535)
        throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

很奇怪,因为:

  1. 在此方法的JavaDoc中没有提及此限制
  2. 通过复制和修改此类的内部static int writeUTF(String str, DataOutput out)方法可以轻松解决此限制
  3. 对方法java.io.DataInputStream.readUTF()没有这样的限制。
  4. 根据上文,我无法理解writeUTF方法中此类限制的目的。我错过了什么或误解了什么?

1 个答案:

答案 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方法”说“好像”。