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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 奋斗的小耗子 中级黑马   /  2014-7-10 20:04  /  3154 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 奋斗的小耗子 于 2014-7-15 14:48 编辑

字节流的视频中说FileOutputStream的write是不需要flush的,
因为字节直接会写入目的地文件,恩,能理解
随后,介绍BufferedInputStream利用缓冲区来提高读取效率,恩,好像懂了
接着就介绍BufferedOutputStream,恩,勉强能懂。
然后,示例通过BufferedInputStream,BufferedOutputStream来复制一个MP3文件
恩,理解了! 额,等等!!!
  1. BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("c:\\0.mp3"));
  2. BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));
  3. int by = 0;
  4. while((by=bufis.read())!=-1)
  5. {
  6.         bufos.write(by);
  7. }
复制代码


然后我就不淡定了,既然FileOutputStream是直接写进文件中,为什么要用BufferedOutputStream呢
bufos.write(by);这句话是把该字节写到哪里去了呢,是流中,还是BufferedOutputStream的缓冲数组中
还是直接写到文件中,还有既然FileInputStream的write不需要刷新,
那么是不是不需要用BufferedOutputStream缓冲呢,还是BufferedOutputStream中没有缓冲区呢?!!!
BufferedOutputStream在这个示例中起什么作用。。。
啊,我头大了,找文档,Google ,百度,都找不到答案,只能求救大家了,本来看的好好的

突然就被自己问懵了,这些概念一下子就模糊了


-----------------------------------------------------------------------------------------------------------------------------------------------------------------

今天又回看了视频,
是此前看太多,一下没消化完,现在理解了,谢谢大家

14 个回复

倒序浏览
谁来拯救我:'(:'(:'(:'(:'(
回复 使用道具 举报
很遗憾  唉  还没看到l流呢  {:3_46:}
回复 使用道具 举报
我为你着迷 发表于 2014-7-10 20:53
很遗憾  唉  还没看到l流呢

没看到io 你分还这么高啊,,羡慕:#
回复 使用道具 举报
你把硬盘和内存的区别弄明白了,这个题目就自然而然明白了
回复 使用道具 举报
买一本Java书,上面都有
回复 使用道具 举报
lc2015 中级黑马 2014-7-11 01:16:30
7#
一下看的太多了吧,休息一下,再看一遍,就懂了
回复 使用道具 举报
郭可 中级黑马 2014-7-11 08:20:15
8#
你是不是没理解BufferedOutputSteam原理 来看看我刚写博客 哈哈http://blog.csdn.net/dream_goon/article/details/37567597
回复 使用道具 举报
郭可 中级黑马 2014-7-11 08:49:34
9#
bufos.write(by); 先把字节写到内存中(也就是Buffered缓冲数组中)当把缓冲数组填满后再一次性写到磁盘中去。如果不用缓冲区,那么你每写一个字节就要访问磁盘一次。假入你这个mp3有1M(1024字节),你用FileOutputStream写这个文件,需要访问磁盘1024次。你用BufferedOutputStream只需要访问磁盘一次,为什么?因为Buffered的默认缓冲区数组是8M,写完这个mp3缓冲数组都还没填满,写完之后就把这1024字节一次性写到磁盘中,这样只需要访问磁盘一次就可以了。
你想一下哪个速度快?我博客里有个例子,带缓冲区的流效率是很高的。因为内存和磁盘在读取速度上不是一个数量级的。不懂你继续问
回复 使用道具 举报
还有一个问题 ,楼主的头像为什么和我一样?这是缘分么  来搞基吧:lol
回复 使用道具 举报
使用字节流缓冲技术,你有读,当然也要有写的啊!
回复 使用道具 举报
郭可 发表于 2014-7-11 08:49
bufos.write(by); 先把字节写到内存中(也就是Buffered缓冲数组中)当把缓冲数组填满后再一次性写到磁盘中 ...

赞一个,,,
回复 使用道具 举报
郭可 发表于 2014-7-11 08:20
你是不是没理解BufferedOutputSteam原理 来看看我刚写博客 哈哈http://blog.csdn.net/dream_goon/article/d ...

写的很好啊,还在理解中
回复 使用道具 举报
郭可 发表于 2014-7-11 08:51
还有一个问题 ,楼主的头像为什么和我一样?这是缘分么  来搞基吧

看来品味相投啊,但搞基...还是算了吧
回复 使用道具 举报
关于缓冲区的解释,毕老师视频中有一个比喻的,假如楼主一顿饭要吃5个包子,而包子是在厨房,楼主又比较喜欢在书房边看java边吃饭,这个时候就可以拿碗,把5个包子装一个碗中,这样楼主只需要跑一次厨房了,没有碗的话,楼主需要跑5次厨房.我的理解,碗应该就是缓冲区的意思了.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马