为什么 Java OutputStream.write() 采用整数但写入字节
2022-09-01 09:45:19
我正在编写一个输出流,刚刚在输出流接口中注意到了这一点,
public abstract void write(int b) throws IOException;
此调用将一个字节写入流,但为什么它采用整数作为参数?
我正在编写一个输出流,刚刚在输出流接口中注意到了这一点,
public abstract void write(int b) throws IOException;
此调用将一个字节写入流,但为什么它采用整数作为参数?
因此,您可以发出 EOF 信号:
“请注意,read() 返回一个整数值。如果输入是字节流,为什么read()不返回字节值?使用int作为返回类型允许read()使用-1来指示它已到达流的末尾。
http://java.sun.com/docs/books/tutorial/essential/io/bytestreams.html
实际上,我最近一直在使用字节,它们可能很烦人。它们在最轻微的挑衅下向上转换为int,并且没有指定将数字转换为字节 - 例如,8l会给你一个长值8,但对于字节,你必须说(字节)8
最重要的是,它们将(几乎)始终作为int存储在内部,除非您使用的是数组(甚至可能是不确定的)。
我认为他们几乎只是假设使用字节的唯一原因是i / o,而您实际上需要8位,但是在内部,他们希望您始终使用int。
顺便说一句,字节的性能可能更糟,因为它总是必须被屏蔽......
至少我记得几年前读过,现在已经可以改变了。
作为您特定问题的示例答案,如果一个函数(f)占用一个字节,并且您有两个字节(b1和b2),则:
f(b1 & b2)
不起作用,因为 b1 和 b2 将被上转换为 int,并且 int 不能自动下转换(精度损失)。因此,您必须编写以下代码:
f( (byte)(b1 & b2) )
这会让人恼火。
不要费心去问为什么b1和b2向上转换 - 我最近一直在抱怨这一点!