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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李大强 中级黑马   /  2013-2-8 18:07  /  2195 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李大强 于 2013-2-12 10:32 编辑

BufferedInputStream 到底是怎样对InputStream进行缓冲的呢?老师讲的替代方法(视频第19天14)好像根本就是多余,它只不过是
又调用了底层的InputStream而已,根本没有自己的独特之处啊!但运行起来怎么比BufferedInputStream还要快(只需十几毫秒,而API
上的需要500多毫秒),既然这样那么java工程师怎么不用老师的方法呢?
程序代码如下:

import java.io.*;

class MyBufferedInputStream//这是老师自定义的BufferedInputStream
{
        private InputStream in;//底层调用的其实还是InputStream而已!

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

        
        public int myRead()throws IOException
        {
                //通过in对象读取硬盘上数据,并存储buf中。
                if(count==0)
                {
                        count = in.read(buf);//这里面调用的还是InputStream的方法,只不过是加了一个缓冲区而已
                                        //我就不信API上面的BufferedInputStream就没有这个缓冲区!
                        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();
        }
}

这个程序效率到底高在哪里了呢?真是不明白!

评分

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

查看全部评分

2 个回复

倒序浏览
缓冲区就好像是一个容器一样,InputStream 没有这个容器,可就是,它读一个字节,outputstream 就写一个字节,

而,BufferedInputStream 不一样,它只要读到缓冲里面,就可以了,不用看是不是bufferedoutputStream读没读,  

就好像运水一样, 没有这个容器,你拿一杯水送过去,必须有人接过去(bufferedoutputstream)你才可以在回去,拿另一杯,
如果中间有,容易,你拿过去,直接倒到容器里面,再回去拿就OK了,

而BufferedReader  是每次操作一个字符,  bufferedinputstream,每次是操作一个字节,

就好像一个大杯子,和一个小杯子的区别。
希望对楼主有所帮助。

评分

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

查看全部评分

回复 使用道具 举报
感觉,你们问的问题都很精彩,呵呵,看来我得加油了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马