在java.io. *包的InputStream类中:
int read()抛出IOException
read()返回字节流类下的字节,但它存储在整数中,没有任何错误 .
为什么会这样?它是如何发生的 . 帮我内存分配设计
Java中的 int 是32位 . Java中的 byte 是8位 . 请尝试以下代码:
int
byte
byte foo = 5; int intFoo = foo;
Java允许您免费提升原语,因为您不会丢失任何信息 .
您可以自由地向上转换(从使用较少字节的原语转换为使用更多字节的原语),因为您没有丢失任何信息(您可以在一个大容器中放置一个小东西) .
只有当你向下转换(从使用更多字节的基元到使用更少字节的基元)时,你必须明确地转换(当你把一个大的东西放在一个小容器中时,你冒着砍掉一些东西的风险它适合)
上下文由javadoc给出,其中说:
“从输入流中读取下一个数据字节 . 值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1 . “
在引擎盖下, read 方法要么返回一个字节,要么流处于EOF位置 . 因此,返回值可能有257种可能的状态,并且(显然)不适合 byte . API通过返回 int 处理此问题,编码按照上面引用的javadoc摘录的规定进行编码 .
read
我没有查看代码,但我希望它有点模糊:
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 类型是基本类型 .
3 回答
Java中的
int
是32位 . Java中的byte
是8位 . 请尝试以下代码:Java允许您免费提升原语,因为您不会丢失任何信息 .
您可以自由地向上转换(从使用较少字节的原语转换为使用更多字节的原语),因为您没有丢失任何信息(您可以在一个大容器中放置一个小东西) .
只有当你向下转换(从使用更多字节的基元到使用更少字节的基元)时,你必须明确地转换(当你把一个大的东西放在一个小容器中时,你冒着砍掉一些东西的风险它适合)
上下文由javadoc给出,其中说:
在引擎盖下,
read
方法要么返回一个字节,要么流处于EOF位置 . 因此,返回值可能有257种可能的状态,并且(显然)不适合byte
. API通过返回int
处理此问题,编码按照上面引用的javadoc摘录的规定进行编码 .我没有查看代码,但我希望它有点模糊:
当你得到结果时,你需要做这样的事情:
没有内存分配问题 .
byte
和int
类型是基本类型 .