A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭润生 中级黑马   /  2012-9-15 13:28  /  1703 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 彭润生 于 2012-9-16 12:17 编辑

class MyBufferedStream
{
private InputStream is;
private byte[] buf = new byte[1024];
private int pos=0,count=0;
MyBufferedStream(InputStream is)
{
  this.is = is;
}
public int myRread()throws IOException//这儿为什么不返回byte,其InputStream中read也是返回int。为什么要返回int,既然里面读的直接就是byte,为什么不返回byte呢。
{
    if(count==0)
    {
     count = is.read(buf);
     if(count<0)
      return -1;
     pos = 0;
     byte b = buf[pos];
     pos++;
     count--;
      return b&255;//提升字节。
    }
    else if(count>0)
    {
     byte b = buf[pos];
     pos++;
     count--;
     return b&0xff;
    }
}
public void myClose()throws IOException
{
  is.close();
}
}

评分

参与人数 1技术分 +1 收起 理由
黑马_许芸 + 1 好问题

查看全部评分

4 个回复

倒序浏览
本帖最后由 马睿 于 2012-9-15 17:01 编辑

毕老师的课程讲述过这个问题……
主要目的是为了区别读取的是 -1 所以定义成int 进行升字节操作(int是32个位数的二进制 ,4个字节)


因为读取的byte是8位二进制

也就是0000-0000~1111-1111的形式(-是连接符)

而在计算机中,你读取文件可能读取到这样的数据
1111-1111 1111-1111 1111-1111 1111-1111
我们知道byte会将 - 1写成1111-1111         byte的范围是 -128~127

而InputStream在返回为-1的时候则认为是文件流的结束,为了区别它
将0000-0000 0000-0000  0000-0000  1111-1111
&1111-1111  1111-1111   1111-1111   1111-1111 (255)
-------------------------------------------------------------------------
最后运算结果
0000-0000  0000-0000   0000-0000  1111-1111  


然后以int返还,这样得到的是255,而不是-1(读取转义为byte类型时又会把它读做-1,原因是byte的范围是 -128~127 ,突然出现个255,除了-1还有谁呢?嘿嘿)

这样做了即可分辨是读取到文件的-1数据了,还是读到文件字节流结束了

评分

参与人数 1技术分 +1 收起 理由
黑马_许芸 + 1 你的分涨的好快,

查看全部评分

回复 使用道具 举报
马睿 发表于 2012-9-15 16:54
毕老师的课程讲述过这个问题……
主要目的是为了区别读取的是 -1 所以定义成int 进行升字节操作(int是32个 ...

那么结束的那个-1呢
回复 使用道具 举报
本帖最后由 马睿 于 2012-9-15 19:00 编辑

结束的那个-1是读到文件流末尾结束return -1
看你的代码里好像漏了return -1

count = is.read(buf); 得到的是单个字节,然后,当读到文件结束的时候会得到一个byte又系统设备中断服务程序返还(抽象层的,你看不到的),其二进制为1111-1111(也就是-1)

public int myRread()throws IOException

这个方法函数最后请再加入一个return -1(你漏了)

因为你对count的判断,其中count = is.read(buf);最后会得到-1,这样会缺少返回值
回复 使用道具 举报
    myRead()这个函数返回-1来判定是否结束,如果按原来byte型返回的话,当数据里有连续8个1会和判定的-1重复,这意味着数据读到1111-1111时即使没读完也会因为返回了-1而停下来。
    可以看出当返回byte的时候都要&255,即延长到32位,高出的24位补0,这样出来的int型数据就不会出现-1了。
    count=is.read(buf);返回的值是读取到数组buf里的byte型数据有多少个,没读到的话就返回-1。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马