我正在编写一个OutputStream,刚刚注意到OutputStream接口中有这个内容:
public abstract void write(int b) throws IOException;
这个调用只向流写入一个字节,但为什么它需要以整数作为参数?
我正在编写一个OutputStream,刚刚注意到OutputStream接口中有这个内容:
public abstract void write(int b) throws IOException;
这个调用只向流写入一个字节,但为什么它需要以整数作为参数?
因此,您可以发送EOF信号:
“请注意,read()返回一个int值。如果输入是一系列字节,为什么read()不返回一个字节值呢?使用int作为返回类型允许read()使用-1来指示它已经到达流的末尾。”
http://java.sun.com/docs/books/tutorial/essential/io/bytestreams.html
最近我一直在处理字节,它们有些令人讨厌。如果稍微有点刺激就会转换为int类型,并且没有特定的方法把一个数字转换为字节--比如8L会给你一个长整型的值8,但是对于字节,你必须写成(byte)8。
除此之外,除非你使用数组(甚至在使用数组时也可能),否则它们几乎总是以int形式存储在内部。
我认为它们只是假定使用字节的唯一原因是要进行输入/输出,实际上你确实需要8位,但在内部它们希望你总是使用int。
顺便说一句,字节的性能可能会更差,因为它总是需要掩码...
至少我记得几年前读过这样的内容,现在可能已经改变了。
作为针对您具体问题的示例答案,如果一个函数(f)接受一个字节,并且你有两个字节(b1和b2),那么:
f(b1 & b2)
这样不行,因为b1和b2会被升级为int类型,而int类型无法自动降级(精度丢失)。所以你需要编写如下代码:
f( (byte)(b1 & b2) )
这会变得很烦人。
而且不要问为什么b1和b2会进行上转换 - 我最近也在咒骂它!
敬礼
write(int)
和write(byte[])
之间的不连续性非常明显,特别是当您看到write(byte[])
的默认实现只是在循环中调用write(int)
时。 - skaffmanwrite(int)
的目的是为了避免用户进行显式转换。就我个人而言,我宁愿使用 write(byte)
这样的规定,而不必阅读文档才能知道有 3/4 的位被忽略。 耸肩 - Grant Wagner更多背景:
IOStream类的假设是,即使传入int类型,调用方实际上只关心数据的最低8位。 只要调用方知道它确实在处理字节,这就没问题,但当底层数据实际上是使用其他字符编码(例如多字节Unicode)的文本时,这就成为一个问题。 这就是为什么读取器类在Java 1.1中引入的原因。 如果您关心文本数据和性能,则IOStream类更快,但读取器类更具可移植性。read()
返回一个int - 以便在$FF时给出255而不是-1。同样,write(int)
也是如此,你不能将$FF存储为byte中的255。
write(int)
的存在是为了与read()
对称。这并不算太糟糕,当你思考它时。好的回答。 - skaffmanwrite()
而不是读取。 - erickson