字节如何存储在整数中

时间:2012-03-17 04:30:33

标签: java inputstream

在java.io. *包的InputStream类中:

int read()抛出IOException

read()返回字节流类下的字节,但它存储在整数中,没有任何错误。

为什么会这样?它是如何发生的。帮助我内存分配设计

3 个答案:

答案 0 :(得分:4)

上下文由javadoc给出,其中说:

  

“从输入流中读取下一个数据字节。值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则该值返回-1。“

在引擎盖下,read方法要么返回一个字节,要么流处于EOF位置。因此,返回值可以是257种可能的状态,并且(显然)不适合byte。 API通过返回int处理此问题,编码按照我上面引用的javadoc摘录进行编码。

我没有查看代码,但我希望它有点模糊:

    if (eof) {
        return -1;
    } else {
        // Casting to an int sign extends to 32 bits,
        // and we then take the bottom 8 bits.
        return ((int) someByte) & 0xff;
    }

当你得到结果时,你需要做这样的事情:

    int res = is.read();
    if (res == -1) {
        // handle EOF case ...
    } else {
        byte b = (byte) res;
        // handle the byte ...
    }

  

也帮我内存分配设计。

没有内存分配问题。 byteint类型是基本类型。

答案 1 :(得分:2)

Java中的int是32位。 Java中的byte是8位。请尝试以下代码:

byte foo = 5;
int intFoo = foo;

Java允许您免费提升原语,因为您不会丢失任何信息。

答案 2 :(得分:1)

你可以自由地向上转换(从使用 less 字节的原语转换为使用 more 字节的原语),因为你没有丢失任何信息(你可以放一个小的在一个大容器里的东西。)

只有当您向下转换(从使用更多字节的基元到使用 less 字节的基元)时才必须显式转换(当您放置时在一个小容器中的大东西,你冒着砍掉一些东西以使其适合的风险)