也许有人可以帮助我理解,因为我觉得我缺少一些可能会影响程序运行方式的东西。
我正在使用ByteArrayOutputStream。除非我错过了很多东西,否则此类的重点是创建一个byte []数组以供其他用途。
但是,BAOS上的“普通”写入功能采用的是整数而不是字节(ByteArrayOutputStream.write)。
根据此(原始数据类型)页面,在Java中,int是32位数据类型,而byte是8位数据类型。
如果我写这段代码…
int i = 32; byte b = i;
我收到有关可能需要对此进行更改的有损转换的警告…
int i = 32; byte b = (byte)i;
我真的对write(int)感到困惑…
ByteArrayOutputStream只是覆盖在中声明的抽象方法OutputStream。因此,真正的问题是OutputStream.write(int),当声明的目标是向流中写入单个字节时,为什么要这样声明。流的实现在这里无关紧要。
ByteArrayOutputStream
OutputStream
OutputStream.write(int)
您的直觉是正确的-在我看来,这是设计的断点。是的,它将丢失数据,正如在文档中明确指出的那样:
要写入的字节是参数b的八个低位。b的24个高阶位被忽略。
(我认为)这样做会更加明智write(byte)。唯一的缺点是,如果不进行强制转换,就无法使用文字值来调用它:
write(byte)
// Write a single byte 0. Works with current code, wouldn't work if the parameter // were byte. stream.write(0);
看起来不错,但不是-因为文字0的类型是int,因此不能隐式转换为byte。您必须使用:
int
byte
// Ugly, but would have been okay with write(byte). stream.write((byte) 0);
对我来说,这不是按原样设计API的充分理由,但这就是我们所拥有的-从Java 1.0开始就拥有了。不幸的是,如果不能在所有地方进行重大更改,现在无法修复。