黑马程序员技术交流社区

标题: BufferedInputStream和InputStream的区别?? [打印本页]

作者: 徐升2013    时间: 2013-4-6 14:17
标题: BufferedInputStream和InputStream的区别??
如题了,即使使用inputStream也可以自定义一个缓冲数组,那么BufferInputStream的好处在什么地方呢?在何时使用合适呢?

作者: 刘吉庆    时间: 2013-4-6 14:30

BufferInputStream是inutStream的包装类。inputStream虽然也可以自己定义缓冲数组,但BufferedInputStream能高效实现某些一些功能:
i. 写数据:br.writer(str/ch/null);
i. 读一行:br.readLine();//读一行
iii. 释放资源:br.close();//内部调用fr.close()


作者: 李希鹏    时间: 2013-4-6 14:30
BufferedInputStream用来改善InputStream的性能,不能单独存在
作者: 田光峰    时间: 2013-4-6 16:06
BufferedinputStream是套在inputStream外,起着缓存的功能,可以用来改善那个inputStream的性能,并且他不能单独存在。
另外他还可以提供更多的方法。
import java.io.*;
public class SS {
        public static void main(String[] args) throws Exception {
                File f = new File("d:\\大型数据库文件.mdf");       
                FileInputStream fis = new FileInputStream(f);
                //如果下面的语句使用BufferedOutputStream来修饰则带来更好的性能现。
                FileOutputStream fos = new FileOutputStream("e:\\" + f.getName());       
                int length = 0;
                byte[] b = new byte[1024];
                while((length = fis.read(b)) != -1)
                {
                        fos.write(b, 0, length);
                }
                fos.close();
                fis.close();
        }
}
作者: 赵亚威    时间: 2013-4-6 16:15
BufferedInputStream利用了缓冲技术 就是为了提高数据的读写i效率 InputStream是一个抽象类 是所有字节流的超类 想要使用必须要有自己的子类来继承它
而且BufferedInputStream这个类可以对数组的指针以及位置进行操作 这是它特有的方法 而楼上所说的:
  写数据:br.writer(str/ch/null);
  读一行:br.readLine();//读一行
这是BufferedWriter以及BufferedReader中的方法 不会要查文档 别乱回答问题
作者: 张先龙    时间: 2013-4-6 16:41
BufferedInputStream的好处在什么地方呢?
提高效率用的, 不用这个方法,就得读一个字节写一个字节,就好像在两个地方板砖 不用BufferedInputStream相当于是一个人搬 用了BufferedInputStream就像用一个汽车来拉 效率不言自明

在何时使用合适呢?
你明白了为什么能提高效率自然很容易想到什么时候适合用了。
作者: 郭彦君    时间: 2013-4-6 16:55
本帖最后由 郭彦君 于 2013-4-6 17:50 编辑

我说错了,我要删除
作者: 刘焕新    时间: 2013-4-6 16:55
本帖最后由 刘焕新 于 2013-4-6 17:01 编辑

1. Java的API已经定义好了有缓冲区功能的InputStream类,我们直接拿来用就Ok了,就不必每次用的时候自己去写一个这样的类,来实现缓冲区功能了。
2. 在频繁读写数据的时候用到缓冲区,特别是数据量大的时候。

缓冲的概念要理解,缓冲的应用也随处可见,例如:
我们要喝水,我们会先用杯子先接水,然后再喝杯子中的水,而不是每喝一口就跑到水龙头下喝一口,那样会很累的,时间也浪费了。
我们要吃米饭,我们会先将米饭盛入碗里,然后再拿着碗来吃,而不是每吃一口就跑到锅里咬一口,那样会很累,时间也浪费了。
以上的杯子和碗就是缓冲区,同一个概念,缓冲区的目的就是为了解决一些频繁操作所带来的资源消耗和工作效率的问题。

硬盘的对数据的读写也是如此,以单个字节为单位太小了,频繁的读写交替,会耗时耗力,对硬盘和磁头也是慢性伤害,缩短使用寿命。
所以,人们想到使用内存作为缓冲区,让磁盘每次读的时候,多读一些;让磁盘每次写入的时候,也多写一些,这样读写的总次数就会少很多!
作者: 陈丽莉    时间: 2013-4-6 18:01
记得及时处理帖子,没问题的话,请将帖子分类改成【已解决】~
作者: 赵亚威    时间: 2013-4-6 18:11
陈丽莉 发表于 2013-4-6 18:01
记得及时处理帖子,没问题的话,请将帖子分类改成【已解决】~

知道了 我会注意的 以后不这样了 讨论有点激烈 呵呵
作者: lyg2013    时间: 2013-4-6 18:24
本帖最后由 lyg2013 于 2013-4-6 18:29 编辑

BufferedInputStream是一个带有缓冲区域的InputStream,它的继承体系如下:

InputStream
|__FilterInputStream
        |__BufferedInputStream
以看作是BufferedInputStream对外提供滑动读取的功能实现,通过预先读入一整段原始输入流数据至缓冲区中,而外界对BufferedInputStream的读取操作实际上是在缓冲区上进行,如果读取的数据超过了缓冲区的范围,那么BufferedInputStream负责重新从原始输入流中载入下一截数据填充缓冲区,然后外界继续通过缓冲区进行数据读取。这样的设计的好处是:避免了大量的磁盘IO,因为原始的InputStream类实现的read是即时读取的,即每一次读取都会是一次磁盘IO操作(哪怕只读取了1个字节的数据),可想而知,如果数据量巨大,这样的磁盘消耗非常可怕。而通过缓冲区的实现,读取可以读取缓冲区中的内容,当读取超过缓冲区的内容后再进行一次磁盘IO,载入一段数据填充缓冲,那么下一次读取一般情况下就直接可以从缓冲区读取,减少了磁盘IO。------参考(我的异常网)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2