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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小陈期待逆袭 中级黑马   /  2013-5-13 09:59  /  1466 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小陈期待逆袭 于 2013-5-13 11:11 编辑

首先我知道缓冲区是装饰类,可以增强功能。
但是他实现高效的原理是什么?创建缓冲对象后存在于内存中哪里?
例如对于  FileOutputStream和BufferedOutputStream  同是调用write(byte[] b)方法;
                               BufferedOutputStream是怎样做到高效的,内存中有什么差别吗?

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

5 个回复

倒序浏览
    缓冲区是一下可以读很多数据 然后再进行书写,  其实也就是插入了一个数组。
      不用缓冲区的话  就是读一下写一下   就比如说你背书  一个字一个字背跟一句话一句话背   你觉得哪个更效率
回复 使用道具 举报
实现高效的原理,就是避免频繁访问硬盘。只在这个缓冲区满了,或执行flush操作,或close()操作 才把数据写入硬盘。
楼主问的是不是问那个缓冲区存哪? 缓冲区就是一个byte[]数组,而数组也是一个对象。对象引用存在栈中,实际对象存在堆中。
楼主的那个例如的话,可以这么解释: 缓冲区就相当于一个大桶,write(byte[])就相同于每次倒一小桶水,wtire(byte ch)就相当于向这个桶里滴入一滴水。用一个小桶是不是就比一滴滴水倒入大桶中,效率高很多呢。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
给你个超无语的事实,缓冲区就是一个数组(char[] 或 byte[] 等,根据处理数据类型封装成不同的缓冲区);
你可以不定义缓冲区,然后自己在读写数据时自己定义一个数组来存储;
缓冲区的作用就是方便你不用自己去定义数组,写它的代码(new 缓冲区),就可以获得指定大小的数组,这算是Java中的简化代码书写、提供方便等。
回复 使用道具 举报
吴文彬 发表于 2013-5-13 10:22
实现高效的原理,就是避免频繁访问硬盘。只在这个缓冲区满了,或执行flush操作,或close()操作 才把数据写 ...

谢谢了,基本上懂了。
但是如果不用缓冲区,只是用FileOutputStream中的write(byte[] b)方法。由于他也会在内存中建立一个数组,是不是作用和缓冲区就一样了呢?
回复 使用道具 举报
那就直接向硬盘写入byte[]数组里面的数据。 而加缓冲区的话,就还有个更大的中介缓冲区。可以更好的减少访问硬盘的次数。
比如说,你不用缓冲区前:写入n个byte[]数据,就要向硬盘写入n次。然后假设,那个中介缓冲区,可以存放5次byte[]数组的数据。那么写入硬盘的次数就可以减少为n / 5次。
以上只是一种假设,实际写入情况当然有其他变动.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马