Java 为什么存在OutputStream的write(intb)方法?
可能重复:Java 为什么存在OutputStream的write(intb)方法?,java,Java,可能重复: 为什么OutputStream类的write()方法在实际逐字节写入数据时采用整数而不是字节?它实际从该int中写入一个字节(8个低阶位)。请参阅文档: Edit:我做了一些挖掘,发现:它与IntputStream.read()是一致的,而且由于大多数操作(sum、mul、div等)都升级为int,因此无需不断转换为字节 我觉得没关系。您可以用它来写有符号或无符号字节。大多数字节流采用无符号字节,匹配的InputStream.read()读取非负的int,您可以将其强制转换为(by
为什么
OutputStream
类的write()
方法在实际逐字节写入数据时采用整数而不是字节?它实际从该int中写入一个字节(8个低阶位)。请参阅文档:
Edit:我做了一些挖掘,发现:它与IntputStream.read()是一致的,而且由于大多数操作(sum、mul、div等)都升级为int,因此无需不断转换为
字节
我觉得没关系。您可以用它来写有符号或无符号字节。大多数字节流采用无符号字节,匹配的InputStream.read()读取非负的int
,您可以将其强制转换为(byte)
,使其具有符号
如果创建readObject和writeObject,则将为您提供一个ObjectInputStream和ObjectOutptStream来读取/写入对象的自定义序列化格式
我想问题是“为什么这个类的设计者没有使用签名write(byte b)
而不是write(int b)
”?谢谢我的提问this@sheo:查看编辑中的链接。它如何处理其他3个字节?它是保留整个int
还是只保留低位字节?(我只是想尽量保持完整)@jili,int中4个字节中的最低字节是由spec写的。。。当然,没有人能阻止你做任何你想做的事情。但是有一个很好的原因,为什么InputStream必须使用不适用于OutputStream的ints(更大的字节):InputStream需要一些监护值来表示它遇到了EOF,这意味着我们必须表示2^8+1的值。但是所有的自动加宽都意味着你几乎没有字节。@Voo,如果你读取了一个int,检查它是否小于0,那么你就可以直接执行了。写(int)时不使用强制转换。简单地说,你不能只得到一个字节,除非得到byte[index]。@Voo,顺便说一句,实际上我已经排除了流的使用,将它们链接起来有点酷,但是IO效率低下的原因之一是多个缓冲区+额外的层。
private void writeObject(ObjectOutputStream oos)
throws IOException {
oos.defaultWriteObject();
// Write/save additional fields
oos.write(byteField);
oos.writeObject(new java.util.Date());
}
// assumes "static java.util.Date aDate;" declared
private void readObject(ObjectInputStream ois)
throws ClassNotFoundException, IOException {
ois.defaultReadObject();
// Read/initialize additional fields
byteField = oos.read();
aDate = (java.util.Date)ois.readObject();
}