7

两者的主要区别是什么?

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

public void writeUTF(String str)
              throws IOException

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

对比

public void writeBytes(String str)
                throws IOException

Writes a String as a sequence of bytes.

我什么时候应该使用一种而不是另一种?

4

5 回答 5

11

它在文档中......来自DataOutput.writeBytes(String)

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

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

换句话说,“Sod Unicode,我们不关心任何不在 ISO-8859-1 中的字符。哦,我们假设你也不关心字符串的长度。”

请注意,writeBytes它甚至不会尝试检测数据损坏 - 如果您写出一个不在 ISO-8859-1 中的字符,它只会默默地删除高字节。

只是说不 -writeUTF是你的朋友......假设你的字符串长度小于 64K。

当然,如果您尝试实现的协议本身需要单字节编码(ISO-8859-1 或 ASCII)并且不使用长度,那么writeBytes 可能是合适的 - 但我个人可能会自己执行文本到字节的转换,然后write(byte[])改用......它更清晰。

于 2013-08-01T14:10:46.450 回答
1

如果您有可能String持有使用宽字符的东西(基本上是标准 ASCII 以外的任何东西),请使用 UTF。如果您的输出需要每个字符一个字节的编码,例如许多网络协议中的标头标签,请使用字节。

于 2013-08-01T14:09:49.633 回答
1

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

于 2013-08-01T14:10:28.133 回答
1

此外,writeUTF 的最大长度为 65535 字节(字节数组的长度取决于 String 的每个字符)。

如果您的 String 的 UTF 表示大于该值,则必须使用自己的转换并使用write(byte[])Jon 所说的转换。

于 2013-08-01T14:17:46.767 回答
0

readUTF()且仅当:

  1. writeUTF()在另一端使用,并且
  2. 你可以忍受 64k 的限制。
于 2013-08-02T01:43:43.290 回答