在的InputStream类java.io. *包的:一个字节被如何存储在整数
INT读()抛出,因为它是字节流类下IOException的
读()返回一个字节,但它存储在整数中,没有任何错误。
为什么这样?以及它是如何发生的。帮我的内存分配设计也
在的InputStream类java.io. *包的:一个字节被如何存储在整数
INT读()抛出,因为它是字节流类下IOException的
读()返回一个字节,但它存储在整数中,没有任何错误。
为什么这样?以及它是如何发生的。帮我的内存分配设计也
您可以自由向上转换(从使用少字节到使用更多字节的原始的),因为你失去任何信息(你可以把一个小东西一个大容器)。
只有当你向下转换(从使用更多字节到使用少字节的原始的),您必须显式转换(当你把一个大的事情在一个小容器,你的风险切断一些东西以使其适合)
Java中的int
是32位。 Java中的byte
是8位。请尝试以下代码:
byte foo = 5;
int intFoo = foo;
Java允许您免费提供基元,因为这样做不会丢失任何信息。
的上下文由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 ...
}
还帮我一下内存分配设计。
没有内存分配问题。 byte
和int
类型是原始类型。
从技术上讲,“字节”是无符号的,而Java的“字节”是有符号的。所以虽然它是8位的“字节”,但它不像Java的原始类型那样是“字节”。 – 2012-03-17 08:49:55