BufferedInputStream

didengxiaren 2010-07-05 11:42:25
初学,BufferedInputStream是怎样起到缓冲作用的?不理解,为什么?
...全文
337 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_348070857 2011-07-25
  • 打赏
  • 举报
回复
缓冲区是读进来先存起来,然后一下全部倒出来
langga跳跃 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dracularking 的回复:]

引用 5 楼 didengxiaren 的回复:

直接用FileInputStream的read方法读一个字节数组,比如说read(byte[] b),能不能起到缓冲作用?和BufferedInputStream有什么区别?

一般是用BufferedInputStream外包FileInputStream来使用,所以单FileInputStream应不具备缓冲功能,比效率的话,可以自……
[/Quote]
不错
baillluu 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 didengxiaren 的回复:]
引用 13 楼 prince_java 的回复:
不用缓冲流,一次只读一个字节或字符,有了缓冲流,一个读取一个缓冲区大小的内容(缓冲区大小可自己定义),速度比较快。打个比方,A屋子里有10个苹果,你要把它们拿到B屋子里去,你说你是一次只拿一个苹果快,还是把它们装进篮子里再往B屋子里放快?


FileInputStream有read(byte[] b)的方法,可以一下子读一个数组不是?与用……
[/Quote]


问个问题,为什么BufferedOutputStream要在Close后才会将字节写让到指定的文件中!Close后会清空缓存,是吧,那,这个缓存里的数据也就只能用一次是么?
enet_java 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 rushly 的回复:]
Inputstream 是一根管道对进去,不停的读. 一根IO管道不停的流。

BufferInputStream 是先搞个小桶装着,装满了。再进行操作。一般最后要flash()一下。有可能最后一桶不是满的 。呵呵
[/Quote]

通俗易懂!!!!!!!!!!
学习ing 2010-07-07
  • 打赏
  • 举报
回复
学习了
chuchuzinnia 2010-07-07
  • 打赏
  • 举报
回复
我也在学习IO。以下是我的理解。
每个流理解成管道,FileInputStream从文件中读出来数据,它的效率低,因为是一个字节一个字节的读。
如果你在这个小管道外面套一个大管道,这个大管道就是BufferedInputStream.具体写法是这样的:
BufferedInputStream bis = new BufferedInputStream (fis); 这就是套在了小管道上了!
你把它理解成一个小桶,一桶装满了倒出去,在装满,在倒出去,是不是效率高多了!
希望对楼主有帮助!
person_java 2010-07-07
  • 打赏
  • 举报
回复
三楼的兄弟很牛!
prince_java 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 didengxiaren 的回复:]
引用 13 楼 prince_java 的回复:
不用缓冲流,一次只读一个字节或字符,有了缓冲流,一个读取一个缓冲区大小的内容(缓冲区大小可自己定义),速度比较快。打个比方,A屋子里有10个苹果,你要把它们拿到B屋子里去,你说你是一次只拿一个苹果快,还是把它们装进篮子里再往B屋子里放快?


FileInputStream有read(byte[] b)的方法,可以一下子读一个数组不是?与用……
[/Quote]
他不是读一个数组,而是一个字节一个字节的将内容读入byte[]中,注意读和读入的区别
didengxiaren 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 prince_java 的回复:]
不用缓冲流,一次只读一个字节或字符,有了缓冲流,一个读取一个缓冲区大小的内容(缓冲区大小可自己定义),速度比较快。打个比方,A屋子里有10个苹果,你要把它们拿到B屋子里去,你说你是一次只拿一个苹果快,还是把它们装进篮子里再往B屋子里放快?
[/Quote]

FileInputStream有read(byte[] b)的方法,可以一下子读一个数组不是?与用缓冲流有什么区别?
didengxiaren 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 prince_java 的回复:]
不用缓冲流,一次只读一个字节或字符,有了缓冲流,一个读取一个缓冲区大小的内容(缓冲区大小可自己定义),速度比较快。打个比方,A屋子里有10个苹果,你要把它们拿到B屋子里去,你说你是一次只拿一个苹果快,还是把它们装进篮子里再往B屋子里放快?
[/Quote]

FileInputStream有read(byte[] b)的方法,可以一下子读一个数组不是?与用缓冲流有什么区别?
didengxiaren 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 prince_java 的回复:]
不用缓冲流,一次只读一个字节或字符,有了缓冲流,一个读取一个缓冲区大小的内容(缓冲区大小可自己定义),速度比较快。打个比方,A屋子里有10个苹果,你要把它们拿到B屋子里去,你说你是一次只拿一个苹果快,还是把它们装进篮子里再往B屋子里放快?
[/Quote]

FileInputStream有read(byte[] b)的方法,可以一下子读一个数组不是?与用缓冲流有什么区别?
prince_java 2010-07-07
  • 打赏
  • 举报
回复
不用缓冲流,一次只读一个字节或字符,有了缓冲流,一个读取一个缓冲区大小的内容(缓冲区大小可自己定义),速度比较快。打个比方,A屋子里有10个苹果,你要把它们拿到B屋子里去,你说你是一次只拿一个苹果快,还是把它们装进篮子里再往B屋子里放快?
spinach_xu 2010-07-07
  • 打赏
  • 举报
回复
学习了
jn789987 2010-07-07
  • 打赏
  • 举报
回复
学习了~~
closewbq 2010-07-05
  • 打赏
  • 举报
回复
缓冲主要是在创建时及时的创建了一个内部缓冲区数组。
protected volatile byte buf[];
自己可以看看源码。
其次理解下装饰器模式的用法。这一章基本贯穿这个模式讲的。
dracularking 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 didengxiaren 的回复:]

直接用FileInputStream的read方法读一个字节数组,比如说read(byte[] b),能不能起到缓冲作用?和BufferedInputStream有什么区别?
[/Quote]
一般是用BufferedInputStream外包FileInputStream来使用,所以单FileInputStream应不具备缓冲功能,比效率的话,可以自己做一个benchmark,比一下两者的性能
任付江 2010-07-05
  • 打赏
  • 举报
回复
就是你先在内存中创建一小块区域,暂时把文件里的东西弄到里面去,慢了,再弄到你想要弄的地方去!
就像你去接水,你那了一个大桶,但是水特别小,于是你就用了一个碗去接!慢了,把碗里的水再倒到桶里!
didengxiaren 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dracularking 的回复:]
首先要知道什么是缓冲,buffering,如CPU和硬盘之间的关系,寄存器或内存就是作为缓冲,如果没有缓冲,当CPU要向硬盘存取数据时,只能直接存取,导致效率低下。
比如总共要读取10个字符,每次用一个,那只能每次从硬盘读一个用一个,如果有缓冲,就能先直接缓冲10个,然后再从缓冲中读一个用一个,出于硬件条件等的天生受限,使用buffering会大大提高效率

同样的道理也适用于Buffere……
[/Quote]

直接用FileInputStream的read方法读一个字节数组,比如说read(byte[] b),能不能起到缓冲作用?和BufferedInputStream有什么区别?
rushly 2010-07-05
  • 打赏
  • 举报
回复
Inputstream 是一根管道对进去,不停的读. 一根IO管道不停的流。

BufferInputStream 是先搞个小桶装着,装满了。再进行操作。一般最后要flash()一下。有可能最后一桶不是满的 。呵呵
dracularking 2010-07-05
  • 打赏
  • 举报
回复
首先要知道什么是缓冲,buffering,如CPU和硬盘之间的关系,寄存器或内存就是作为缓冲,如果没有缓冲,当CPU要向硬盘存取数据时,只能直接存取,导致效率低下。
比如总共要读取10个字符,每次用一个,那只能每次从硬盘读一个用一个,如果有缓冲,就能先直接缓冲10个,然后再从缓冲中读一个用一个,出于硬件条件等的天生受限,使用buffering会大大提高效率

同样的道理也适用于BufferedInputStream,其是内建了缓冲数组:
/**
* The internal buffer array where the data is stored. When necessary,
* it may be replaced by another array of
* a different size.
*/
protected volatile byte buf[];
在BufferedInputStream创建时创建,用于buffer the input
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧