为什么 Java OutputStream.write() 采用整数但写入字节

2022-09-01 09:45:19

我正在编写一个输出流,刚刚在输出流接口中注意到了这一点,

   public abstract void write(int b) throws IOException;

此调用将一个字节写入流,但为什么它采用整数作为参数?


答案 1

因此,您可以发出 EOF 信号:

“请注意,read() 返回一个整数值。如果输入是字节流,为什么read()不返回字节值?使用int作为返回类型允许read()使用-1来指示它已到达流的末尾。

http://java.sun.com/docs/books/tutorial/essential/io/bytestreams.html


答案 2

实际上,我最近一直在使用字节,它们可能很烦人。它们在最轻微的挑衅下向上转换为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向上转换 - 我最近一直在抱怨这一点!


推荐