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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 康大玮 中级黑马   /  2012-6-9 12:58  /  1327 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;

class MyBufferedInputStream
{
        private InputStream in;

        private byte[] buf = new byte[1024*4];
               
        private int pos = 0,count = 0;
       
        MyBufferedInputStream(InputStream in)
        {
                this.in = in;
        }

        public int myRead()throws IOException  //这个方法不理解
        {
                if(count==0)
                {
                        count = in.read(buf);
                        if(count<0)
                                return -1;
                        pos = 0;
                        byte b = buf[pos];

                        count--;
                        pos++;
                        return b&255;
                }
                else if(count>0)
                {
                        byte b = buf[pos];

                        count--;
                        pos++;
                        return b&0xff;
                }
                return -1;

        }
        public void myClose()throws IOException
        {
                in.close();
        }
}

4 个回复

倒序浏览
我也没看明白
回复 使用道具 举报
本帖最后由 陈嘉宾 于 2012-6-9 13:32 编辑

count为0就往数组里面存数据,我理解的count代表一个计数器的功能取数据个数或长度,然后[pos]取数据代表指针,计数器计算数据个数,如果数据个数减少,那么代表着指针增加就是取得个数就是增加,然后循环这个方法,都取完后count=0了pos也要归0就是循环取。取到结尾没有数据了再取得时候count值就为负了,所以返回-1结束
回复 使用道具 举报
  1. public int myRead()throws IOException  //这个方法不理解
  2.         {
  3.                 if(count==0)//count初始值为0
  4.                 {
  5.                         count = in.read(buf);//读一次,将读到的字节数赋予count,同时将读到的数据放进buf里,count最大值为1024*4
  6.                         if(count<0)//如果没有读到数据
  7.                                 return -1;//返回-1
  8.                         pos = 0;//后面会将buf里的字节一个一个取出,这里的pos便是每次取出字节的下标,这里为0,表示从第一个开始取
  9.                         byte b = buf[pos];//将buf中下标为pos的字节取出,此处取出的是buf[0]

  10.                         count--;//count是buf数组里有效的字节数,刚取出了一个字节,所以这里的count要减一
  11.                         pos++;//pos表示buf里下一个要读的字节下标,每次取出后,要向后移一个,故加一
  12.                         return b&255;//将取出的字节返回,与255相&是因为b有可能会被解释成负数。
  13.                 }
  14.                 else if(count>0)//count>0表示buf里还有需要取出的字节
  15.                 {
  16.                         byte b = buf[pos];//将当前pos位置的字节取出

  17.                         count--;//同样,buf里可取的字节数减一
  18.                         pos++;//同样,下一个待取的字节位置向后移一个
  19.                         return b&0xff;//返回刚取出的字节
  20.                 }
  21.                 return -1;

  22.         }
复制代码
注意,当byte转int时,必须先&255或0xff,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111,即0xffffffff,但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。
回复 使用道具 举报
import java.io.*;

class MyBufferedInputStream
{
        private InputStream in;

        private byte[] buf = new byte[1024*4];
               
        private int pos = 0,count = 0;
        
        MyBufferedInputStream(InputStream in)
        {
                this.in = in;
        }

        public int myRead()throws IOException  //这个方法不理解
        {
                if(count==0)当count为0时。表示里面的数据被取完。然后下的代码再往里面存数据;
                {
                        count = in.read(buf);//以in对象读取硬盘上的数据;并存储到buf中;
                        if(count<0)//当count小于0时。表示目标沼数据已经被取完程序结束;
                                return -1;
                        pos = 0;//第二次循环的时候还是从0开始取数据;
                        byte b = buf[pos]; //第一次取0角标元素;

                        count--;//每取一次,count中的数据减一个;
                        pos++;//第二次就要取pos++角标的元素;
                        return b&255;//&255是为了把b前面三个字节用0补全;
                }
                else if(count>0)//当count里大于0时,就需要再存储数据。直接取就是了
                {
                        byte b = buf[pos];

                        count--;
                        pos++;
                        return b&0xff;
                }
                return -1;

        }
        public void myClose()throws IOException
        {
                in.close();
        }
}
希望你这下你可以看的懂,不行的话可以看看毕老师的IO流19天;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马