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

And*_*niy 10 java dataoutputstream restrictions

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

    if (utflen > 65535)
        throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为:

  1. 在这种方法的JavaDoc中没有提到这种限制
  2. 通过复制和修改此类的内部static int writeUTF(String str, DataOutput out)方法可以轻松解决此限制
  3. 相反的方法没有这种限制java.io.DataInputStream.readUTF().

根据上面我无法理解这种限制writeUTF方法的目的.我错过了什么或误解了什么?

Erw*_*idt 14

的Javadoc中DataOutputStream.writeUTF指出:

首先,将两个字节写入输出流,就像通过writeShort给出要遵循的字节数的 方法一样.该值是实际写出的字节数,而不是字符串的长度.

两个字节表示16位:在16位中,可以编码的最大整数是2^16== 65535. DataInputStream.readUTF具有完全相同的限制,因为它首先以2字节整数的形式读取要使用的UTF-8字节数,它最多只能有65535的最大值.


writeUTF首先写入两个具有长度的字节,其结果与调用writeShort长度相同,然后写入UTF编码的字节.writeUTF实际上并没有调用writeShort- 它构建了一个byte[]具有2字节长度和UTF字节的单个.但这就是为什么Javadoc说" 好像通过writeShort方法"而不仅仅是"通过writeShort方法".

  • @Andremoniy添加了我对答案的回答 (2认同)