`
bastengao
  • 浏览: 149467 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

InputStream read 方法需要注意的地方

    博客分类:
  • java
 
阅读更多
因为做毕业设计的需要,要用到 InputStream ,需要自己实现一个 InputStream 。因为 InputStream 是抽象类,已经有骨架实现,只需要实现 int read() 方法即可。
一开始是这样写的,
public int read(){
    //此处略去若干字
    byte b=... 
    //此处略去若干字
    return (int)b ;
}


可是发现不对,流传着传着还没到结尾就完了。感觉很蹊跷,这个问题困扰我累计10小时,左思右想不得结果。api是这样解释 read 方法的
引用

从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

看到这个我有些纳闷,byte 的取值范围是从-128 到 127,但他让我返回 0 到 255。
问题在于 将 byte 直接 转换为 int 值是不发生改变的。比如 -1 的  byte 转换 为 int 还为 -1。但如果将 -1  返回,那么就表示到达 流的结尾。所以应该将 byte 转换 为 0 到 255 范围的 int。但具体怎么转呢,我一开始是直接将 byte 加 128 然后 转为 int的。可是经过验证是错的。那具体应该怎么转呢? 正不行,倒着来。因为客户端在使用 read 方法是这样使用的
int i=in.read();
byte b=(byte)i;

看他们转换结果,反着来就可以了。经过测试 将 int 转换为 byte,当 int 在 0 到 127 范围内值是相等的;当 int 在 128 到 255 范围内,对应 byte 的 -128 到 -1,相当于减了个 256。所以猜想应该这样实现read 方法
public int read(){
    //此处略去若干字
    byte b=... 
    //此处略去若干字
    if(b<0){
       b=b+256;
    }
    return (int)b ;
}
。经验证正确。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics