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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 霍明波 中级黑马   /  2012-8-21 15:35  /  1100 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 霍明波 于 2012-8-21 15:41 编辑

在学习IO的缓冲区的时候,提到缓冲区的效率高,但是不知道是怎么样的高法,无缓冲的Filereader等是怎样的慢法,曾经还发现小容量IOl流传递的时候无缓冲的还要快点,还有就是关于cpu,缓冲区,内存,之间该怎么理解呢,一直是套路明白,但是不知道其中的奥妙,望高手解答   谢谢

2 个回复

倒序浏览
本帖最后由 刘芮铭 于 2012-8-21 15:50 编辑

如果没有缓冲区,应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,
当写入设备时,先写入缓冲区,等到缓冲区有足够多的数据时,就整体写入设备。
缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高

我对CPU,内存,缓冲区的理解:
(1)CPU是负责运算和处理的!
(2)内存是交换数据的!
(3)缓冲区就是内存中存放数据的地方!

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我们举两个例子:
BufferedInputStream和FileInputStream
当用FileInputStream时,read()是从底层读取一个字节,read(byte[],int off,int len)
则是一次性取len-off个字节,我们需要提供一个byte[]来存放。
而用BufferedInputStream的时候,其read()其实和read(byte[],int off,int len)一样
内部都是调运构造函数输入的的FIleInputStream的read(byte[] ,int off,int len)的方法,将底层数据读入byte[]中,而且byte[]不需要我们来提供,类本身定义了一个byte[] buf数组,来存放这些数据,所以,如果是使用BufferedInputStreamer
而程序要不需要对byte[]数组操作,直接这样写就可以:
FileInputStream fis=new FileInputStream("a.txt");
BufferedInputStream bis=new  BufferedInputStream(fis);
int data=0;
while((data=bis.read())!=-1){
.....
}
这样虽然也是一次次读一个字节,但是不是吗,每次都是从底层读取数据,而是一次从底层读取buf.length个字节到buf数组中,然后从buf中一次读取一个字节,减少频繁调用底层资源的开销。
这个等同于
FileInputStream fis=new FileInputStream("a.txt");
byte[] mybuff=new byte[1024];
int count=0;
while((count=fis.read(mybuff))!=-1)
{
...
}
如果是用BufferedInputStream的read(byte [],int off,int len),那缓冲则由传入的byte[]
来充当。
所恶这么多,那如果要缓冲用FileInputStream还是BufferedInputStream?
BufferedInputStream主要不是提供buf,而是封装了缓冲和标记、回读的功能
。如果既用不到标记和回读,又不需要操作中间的缓冲数组,那么显而易见直接用FielInputStream的read(byte [],int off,int len)效率最高。
最后说一下为什么,为什么用缓冲性能就更好,因为程序可以将多个字节写入底层输入流(native read(byte)),而不必针对每一个字节写入都调用底层输入流(native read(byte)),

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

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