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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张旭 中级黑马   /  2013-1-30 16:23  /  1407 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.*;

  2. class MyBufferedInputStream
  3. {
  4.         private InputStream in;

  5.         private byte[] buf = new byte[1024*4];
  6.                
  7.         private int pos = 0,count = 0;
  8.        
  9.         MyBufferedInputStream(InputStream in)
  10.         {
  11.                 this.in = in;
  12.         }

  13.         //一次读一个字节,从缓冲区(字节数组)获取。
  14.         public int myRead()throws IOException
  15.         {
  16.                 //通过in对象读取硬盘上数据,并存储buf中。
  17.                 if(count==0)
  18.                 {
  19.                         count = in.read(buf);
  20.                         if(count<0)
  21.                                 return -1;
  22.                         pos = 0;

  23. */  不是太理解这个为什么这个时候   这个数组装了 pos个
  24.                         byte b = buf[pos];


  25. // count 为什么要 自减下
  26.                         count--;
  27.                         pos++;
  28.                         return b&255;
  29.                 }
  30.                 else if(count>0)
  31.                 {
  32.                         byte b = buf[pos];

  33.                         count--;
  34.                         pos++;
  35.                         return b&0xff;
  36.                 }
  37.                 return -1;

  38.         }
  39.         public void myClose()throws IOException
  40.         {
  41.                 in.close();
  42.         }
  43. }


  44. /*
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

5 个回复

倒序浏览
额 pos是指针 不是你想的pos个,pos初始化为0,read方法
read(byte[] buf)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 buf中。
返回的count值是这一次读的字节的数量,你取出一个字节,count就减一,直到把这次的读取的所有字节全部返回

还不懂的话,看看老师画的那个缓冲区的图就会明白了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
数组一次装了count个,不是pos个!!!!pos是数组的角标,一次次的把数组从前到后读出来,
读一次,总数Count就记数减一个,方便减到0时再读入!
pos自加,遍历数组一般!!!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
嗯 理解了 谢谢
回复 使用道具 举报
count==0,之后,也就是重新开始读取数据,读取之后,因为存储在数组中缓冲区中,要从数组缓冲区,自然是从0下标开始取啦!所以就从这里就用用pos作为下标跟踪,buf[pos]s是第pos个,不是共有pos个哦!取出的时候也方便直接获取数组的长度,从而避免输出为空的情况。Count--是计数器的作用,每从缓冲区取出一个元素,就减1,这样子才能知道是否已经读取完了呀!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
楼主已经清楚,我在这里就说一下myRead方法原理和具体实现。
myRead函数主要是把数据抓到缓冲区里,并从缓冲区里一次读一个字节
那么原理是定义一个数组,把流里面的数据抓到数据里面,但是数组长度固定,定义的数组可能装不下;
此时就要用循环读取,但是最后一次读的数组可能就不是数组的长度,此时要把数组里面元素的有效位数找到,通过readread(byte[] b)方法。

用一个count变量记住一次读的字节的数量,每读myRead一次时,就把缓冲区里的字节赋值给一个变量,怎么赋值?这根把数组元素的值赋给变量一样,
并且每次赋值时,数组指针会随myRead读取次数向后移1位,故会有pos++,并且把count--(为了后面的count==0),并把变量处理后返回出去;当count为0时候,
此时又会调用一次read(byte[] b) 方法,如此循环,直到count小于(或等于(最后一次))自己定义的数组长度,当读到最后一次字节再往下读的时,此时count为0,
又会执行read(byte[] b) 方法,但此时的count返回-1,就不要在继续读取下去了。
需要注意的是:每读取一次myRead方法,就爱需要读取下一个字节,就需要pos++;
int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。

点评

很棒  发表于 2013-1-30 22:03

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马