我想使用DataOutputStream#writeBytes,但遇到了错误。来自Java文档的writeBytes(String)
的描述:
将字符串作为字节序列写入基础输出流。字符串中的每个字符按顺序写出,丢弃其高8位。
我认为我遇到的问题是由于关于“丢弃其高八位”的部分。这是什么意思,为什么它会这样运作?
答案 0 :(得分:6)
大多数西方程序员倾向于用ASCII来思考,其中一个字符等于一个字节,但Java String
是16位Unicode。 writeBytes
只写出低位字节,对于ASCII / ISO-8859-1,它是C语义中的“字符”。
答案 1 :(得分:2)
char
数据类型是一个 16-bit
Unicode字符。它的最小值为'\u0000'
(或0),最大值为'\uffff'
(或65,535
(含)。但byte
数据类型是 8-bit
签名的二进制补码整数。它的最小值为-128
,最大值为127
(含)。这就是为什么这个函数从头到尾写入字符串中每个字符的低位字节的原因。高位字节中的任何信息都将丢失。换句话说,它假定字符串仅包含值在0
和255
之间的字符。
您可以查看writeUTF(String s)
方法,该方法保留高位字节中的信息以及字符串的长度。首先,它将字符串中的字符数写入基础输出流,作为0
和65,535
之间的2字节无符号整数。接下来,它对UTF-8
中的字符串进行编码,并将编码字符串的字节写入基础输出流。这允许读取这些字节的数据输入流完全重建字符串。