gpt4 book ai didi

java - 为什么 ByteArrayOutputStream 使用 int?

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:28 24 4
gpt4 key购买 nike

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

我正在使用 ByteArrayOutputStream。除非我错过了一些重要的东西,否则这个类的重点是创建一个 byte[] 数组以供其他用途。

但是,BAOS 上的“普通”写入函数采用 int 而不是字节 (ByteArrayOutputStream.write)。

根据这个(Primitive Data Types)页面,在 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)以这种方式声明,当其声明的目标是将单个字节写入流时。流的实现在这里无关紧要。

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

The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.

将其设为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 以来一直拥有。不幸的是,如果不在整个地方进行重大更改,现在无法修复它。

关于java - 为什么 ByteArrayOutputStream 使用 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21439695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com