15

方法中有一个奇怪的限制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()

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

4

1 回答 1

17

各州的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方法”。

于 2014-03-30T07:51:06.937 回答