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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 215041631 中级黑马   /  2014-7-19 12:13  /  1536 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  为什么IO中的装饰类像BufferedRead和BufferedInputStream等类的读写效率要比FileReader和其他的快呢?直接从硬盘读取写入另一个位置的效率为什么比他们慢那么多啊。原因是什么?关乎硬件问题?如果说硬盘速度跟内存速度一样的话,缓冲区类就没必要出现的必要了吗?比如我的文件是存储在SSD中

6 个回复

倒序浏览
Reader、InputStream这样的读写是一个一个字符或字节的读写,BufferedRead和BufferedInputStream是建立一个缓冲区将每次取到的每个字符或字节存起来,达到一定量的时候将其从缓冲区一口气输出去。这样相比之下,后者就会更快些。打个比方:两个人都往自己碗里装花生米,第一个人一颗一颗的夹着装进来,第二个人先把花生米用勺子舀起来,再一勺子全部放进来,你猜猜谁装的快?
回复 使用道具 举报
楼上正解!!
回复 使用道具 举报
a6511631 发表于 2014-7-20 09:02
Reader、InputStream这样的读写是一个一个字符或字节的读写,BufferedRead和BufferedInputStream是建立一个 ...

貌似说反了把,你说那是BufferWriter和BufferedOutputStream把,先把东西缓存起来,等达到一定的数量,一次性写进去。BufferedRead和BufferedInputStream是先把读取文件中的一部分数据缓存到内存中,每次读的时候从内存中读取,难道不是这样吗?还是我理解的不对
回复 使用道具 举报
主要是硬盘读取速度比内存慢的多,如果内存等着硬盘一个一个传递字符,太浪费时间。好比硬盘读取一个字符需要1毫秒,内存处理一个字符只需要0.0001毫秒,那么内存有必要为了那0.00001毫秒而去等1毫秒吗,太浪费资源了。所以出现了缓冲区。从根本上讲,是硬件的原因。
回复 使用道具 举报
硬件读一个字节,写入内存,然后回来再读一个 ,再写入。效率很低,,因为磁头需要来回的擦入,操作系统里面有一个关于硬盘读写最优的一个原则,就是最短路径优先,也就是磁头来回擦的路径优先,一个一个读,然后再一个一个写,磁头是需要来回擦入的,效率也就降下来了。我们再看,有缓冲区的如果可以一直读硬盘,读了之后临时存储在缓冲区对象封装的数组中,然后以下子,写出去,那样磁头就不需要来回的擦入,也就尽最大可能的满足最短路径优先,那样就非常高效率了。这也是为什么缓冲区对象,有readLine的原因,
当然如果没有缓冲区,一个好的硬盘,读写效率也是会快很多的。尽管硬盘的读写效率达到内存速率,没有缓冲区的还是要慢很多,因为不满足最短路径优先。
回复 使用道具 举报
爨庚轩 发表于 2014-7-20 09:54
貌似说反了把,你说那是BufferWriter和BufferedOutputStream把,先把东西缓存起来,等达到一定的数量,一 ...

我偷懒没有把对象写全,我的意思是读写时的区别,读写除了BufferReader和BufferedInputStream还包括你说的BufferWriter和BufferedOutputStream。【偷懒】
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马