2012-03-17 67 views
0

在的InputStream类java.io. *包的:一个字节被如何存储在整数

INT读()抛出,因为它是字节流类下IOException的

读()返回一个字节,但它存储在整数中,没有任何错误。

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

+1

从技术上讲,“字节”是无符号的,而Java的“字节”是有符号的。所以虽然它是8位的“字节”,但它不像Java的原始类型那样是“字节”。 – 2012-03-17 08:49:55

回答

1

您可以自由向上转换(从使用字节到使用更多字节的原始的),因为你失去任何信息(你可以把一个小东西一个大容器)。

只有当你向下转换(从使用更多字节到使用字节的原始的),您必须显式转换(当你把一个大的事情在一个小容器,你的风险切断一些东西以使其适合)

2

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

byte foo = 5; 
int intFoo = foo; 

Java允许您免费提供基元,因为这样做不会丢失任何信息。

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类型是原始类型。

相关问题