小编典典

为什么ByteArrayOutputStream使用int?

java

也许有人可以帮助我理解,因为我觉得我缺少一些可能会影响程序运行方式的东西。

我正在使用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)感到困惑…


阅读 209

收藏
2020-11-01

共1个答案

小编典典

ByteArrayOutputStream只是覆盖在中声明的抽象方法OutputStream。因此,真正的问题是OutputStream.write(int),当声明的目标是向流中写入单个字节时,为什么要这样声明。流的实现在这里无关紧要。

您的直觉是正确的-在我看来,这是设计的断点。是的,它将丢失数据,正如在文档中明确指出的那样:

要写入的字节是参数b的八个低位。b的24个高阶位被忽略。

(我认为)这样做会更加明智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。您必须使用:

// Ugly, but would have been okay with write(byte).
stream.write((byte) 0);

对我来说,这不是按原样设计API的充分理由,但这就是我们所拥有的-从Java 1.0开始就拥有了。不幸的是,如果不能在所有地方进行重大更改,现在无法修复。

2020-11-01