![](/img/trans.png)
[英]ObjectOutputStream.writeBytes(String s) unexpected output values
[英]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()
:
writeUTF()
,和
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.