InputStream read 方法需要注意的地方

因为做毕业设计的需要,要用到 InputStream ,需要自己实现一个 InputStream 。因为 InputStream 是抽象类,已经有骨架实现,只需要实现 int read() 方法即可。
一开始是这样写的,

public int read(){
//此处略去若干字
byte b=...
//此处略去若干字
return (int)b ;
}


可是发现不对,流传着传着还没到结尾就完了。感觉很蹊跷,这个问题困扰我累计10小时,左思右想不得结果。api是这样解释 read 方法的
[quote]
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。 [/quote]
看到这个我有些纳闷,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 ;
}
。经验证正确。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值