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

2022-09-03 14:17:17

方法中有一个奇怪的限制,它将UTF-8编码字符串的大小限制为字节:java.io.DataOutputStream.writeUTF(String str)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


答案 1

DataOutputStream.writeUTF 的 Javadoc 指出:

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

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


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


答案 2

推荐