ObjectOutputStream方法:writeBytes(String str)vs writeUTF(String s);

时间:2013-08-01 14:05:38

标签: java io objectinputstream

两者之间的主要区别是什么?

它们两个都是用于编写字符串。

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 个答案:

答案 0 :(得分:8)

来自DataOutput.writeBytes(String)的文档......

  

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

     

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

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

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

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

当然,如果你有一个协议,你试图实现哪个本身需要单字节编码(ISO-8859-1或ASCII)并且不使用长度,那么{{1 可能是合适的 - 但我个人可能会自己执行文本到字节的转换,然后使用writeBytes代替......它更清晰。< / p>

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在adition中,writeUTF的最大长度为65535字节(字节数组的长度取决于字符串的每个字符)。

如果你的String的UTF表示大于那个,你必须使用你自己的转换,并使用Jon所说的write(byte[])

答案 4 :(得分:0)

当且仅当:

时,您应该使用readUTF()
  1. 您在另一端使用writeUTF()
  2. 您可以忍受64k限制。