繁体   English   中英

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

[英]ObjectOutputStream methods: writeBytes(String str) vs writeUTF(String s);

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

他们俩都是为了写字符串。

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.

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

它位于文档中...来自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)并且不使用长度,那么writeBytes 可能是合适的 - 但我个人可能自己执行文本到字节的转换,然后使用write(byte[])代替......它更清晰。

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

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

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

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

当且仅当以下情况时,您应该使用readUTF()

  1. 你在另一端使用writeUTF() ,和
  2. 你可以忍受64k的限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM