ObjectOutputStream方法:writeBytes(String str)与writeUTF(String s)的区别是什么?

7

它们之间的主要区别是什么?

它们仍然都是用于编写字符串的。

public void writeUTF(String str)
              throws IOException

Primitive data write of this String in modified UTF-8 format.

vs

public void writeBytes(String str)
                throws IOException

Writes a String as a sequence of bytes.

什么情况下应该使用其中一个而不是另一个?
5个回答

11

在文档中有这样一段描述,来自DataOutput.writeBytes(String):

向输出流写入一个字符串。对于字符串s中的每个字符,按顺序写入一个字节到输出流中。如果s为null,则会抛出NullPointerException。

如果s.length为零,则不会写入任何字节。否则,先写入字符s[0],然后是s1,以此类推;最后写入的字符是s[s.length-1]。对于每个字符,都会写入一个字节,即低位字节,方式与writeByte方法完全相同。字符串中每个字符的高8位将被忽略。

换句话说,“我们不要Unicode,我们只关心ISO-8859-1中包含的字符。哦,还有我们假设您也不关心字符串的长度。”

请注意,writeBytes甚至不尝试检测数据损坏 - 如果您写出的字符不在ISO-8859-1中,它将默默地丢弃高位字节。

拒绝使用writeByteswriteUTF才是您的朋友... 假设您的字符串长度小于64K。

当然,如果您正在尝试实现一种需要单字节编码(ISO-8859-1或ASCII)且不使用长度的协议,则writeBytes 可能是适当的 - 但我个人可能会自己执行文本到字节的转换,然后使用write(byte[])替代...这样更清晰。


1
如果您的String可能包含使用宽字符的内容(基本上是超出标准ASCII范围的任何内容),请使用UTF。 如果您的输出将发送到需要每个字符一个字节的编码(例如许多网络协议中的标题标签),请使用字节。

1
当使用UTF存储数据时,数据存储在通用字符集中,因此当您的字符串数据包含ASCII字符以外的字符时,请使用writeUTF,否则可以使用writeByte。

1
此外,writeUTF 的最大长度为 65535 字节(byte 数组的长度取决于每个字符的 String)。如果您的字符串的 UTF 表示比这更大,您必须使用自己的转换并使用 Jon 所说的 write(byte[])。

1
这应该是一条注释,而不是答案。 - Joel

0

只有当以下两个条件都满足时,您才应该使用readUTF()方法:

  1. 在另一端使用了writeUTF()方法;
  2. 您可以接受64K的限制。

64 kb 在字符串中是多少? - Rollerball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接