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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小黑子 于 2014-9-29 13:24 编辑

BufferedInputStream与InputStream到底有什么不同呢?
我理解的是,Buffered就是增加了缓冲区的功能。可是InputStream中有个 int read(byte[] b)方法,
完全可以通过自定义一个字节数组实现缓冲区啊?难道BufferedInputStream的意义就在于把这个字节数组封装了???

4 个回复

倒序浏览
没错 ! 就是这个把字节数组封装到Buffered中的缓冲机制.
这样的好处就是避免了按照一个字节一个字节的对硬盘进行读取,
而是按照一个数组的长度为一组对该文件(硬盘上的数据)进行按字节读取.
我们来看一下模拟该机制的实现方法:


class MyBufferedInputStream
{
        private InputStream in;  //声明一个读取流
        private int pos=0,count=0;  //声明一个数组脚标指针以及计数器.

        private byte[] buf = new byte[1024];  //创建一个byte型的长度为1024的数组

        MyBufferedInputStream(InputStream in)  //构造函数中进行对象的传递
        {
                this.in = in;               
        }
        //一次读一个字节,从缓冲区(字节数组)中获取.
        public int myRead()throws IOException  //完成缓存的函数机制开始
        {        //通过in对象读取硬盘上的数据,并存储到buf中.
                if (count == 0)           //意思是,如果所操作的指针为0就开始让该数组重新读取文件一次.并且将计数器清零.
                {               
                        count = in.read(buf);      //获取当前 读取流 读取字节到数组中的长度(避免了在最后一次读取长度不满的情况下出现非法数据).
                        pos =0;            //将数组的脚标指针清.
                        if (count < 0)         //这步是和上面读取数据到 缓存中的相呼应的, 如果 数据读完了  那么  in.read再读一次的时候返回的肯定是-1,因为数据到结尾了返回的就是-1.
                        {
                                return -1;
                        }

                        byte byt = buf[pos];     //buf数组重新复位一次后的第一次进行对buf中的值进行读取.(此步是加载后的第一次,源是内存,也就是buf数组.)
                        pos++;          //脚标自增,为了继续取出下一个值.
                        count--;          //计数器递减,为了控制该数组中的有效值.
                        return byt&0xff;      //这个地方就是有关类型自动提升时所涉及到的原理了,这样理解就比较简单里,默认的类型提升是根据该数据的最高位进行补的. 也就是说如果该文件是1111的话,那么默认的补位的情况就一定会将前面都补上1,但是这样就和我们在取到最后时所要判断的-1为返回值表示文件结尾的依据有冲突.
                }
                else if(count >0)           //数组复位后的非第一次的对数组中的数据进行读取.
                {
                        byte byt = buf[pos];
                        pos++;
                        count--;
                        return byt&255;
                       
                }
                return -1;              //为了编译通过, 在if 判断语句的最后返回-1
        }

}

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这是一种包装设计模式,目的就是为了简化代码,其实你看源码的话,buffered里面是封装了一个1024*8的字节数组的
回复 使用道具 举报
装饰设计模式啦
回复 使用道具 举报
ζ_____________ 发表于 2014-9-29 09:42
没错 ! 就是这个把字节数组封装到Buffered中的缓冲机制.
这样的好处就是避免了按照一个字节一个字节的对硬 ...

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