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()

根据上述内容,我无法理解该writeUTF方法中这种限制的目的我错过或误解了什么?

欧文·博威特

状态JavadocDataOutputStream.writeUTF

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

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


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

由于UTFDataFormatException引起的任务无法在Spark中序列化:编码字符串太长

来自分类Dev

编码和解码字符串

来自分类Dev

URL编码字符串

来自分类Dev

编码字符串数组

来自分类Dev

PHP中的编码字符串

来自分类Dev

从strftime编码字符串

来自分类Dev

URL编码字符串

来自分类Dev

编码和解码字符串

来自分类Dev

使用 Python 编码字符串

来自分类Dev

字符串中的编码字符阻止提交

来自分类Dev

转义/编码字符串的类型不同

来自分类Dev

解码Java中的编码字符串?

来自分类Dev

如何在Angularjs中编码字符串?

来自分类Dev

不要混淆Proguard中的硬编码字符串

来自分类Dev

从node.js返回JSON编码字符串

来自分类Dev

NodeJ中的URL编码字符串

来自分类Dev

使用ei_encode_string编码字符串

来自分类Dev

将编码字符串需要较少的内存?

来自分类Dev

如何在Eclipse中编码字符串?

来自分类Dev

如何在Android中制作编码字符串?

来自分类Dev

如何在urlopen中正确编码字符串?

来自分类Dev

如何在urlopen中正确编码字符串?

来自分类Dev

Android编码字符串错误(属性缺失)

来自分类Dev

以非字母数字顺序编码字符串变量

来自分类Dev

如何在文件内容中编码字符串?

来自分类Dev

不要混淆Proguard中的硬编码字符串

来自分类Dev

使用python CSS方式编码字符串

来自分类Dev

转义/编码字符串的类型不同

来自分类Dev

在utf8中编码字节字符串