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

© 郑飞 高级黑马   /  2014-8-29 14:31  /  1593 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

FileReader 中read()方法 一次性读取一个数组字符 BufferedReader 中的readLine() 一次读一行字符 就缓冲而言 read还能定义读取的量 那BufferedReader的存在就是为了实现读取一行和缓冲结合的便利性?
用字节流来表达说的更清楚点:

如果是字节流 就更不存在读一行这个特殊功能 以我的理解 BufferedReader和BufferedWriter实现缓冲的过程是这样的
FileReader fr = new FileReader("aa.txt");
FileWriter fw = new FileWriter("bb.txt");
BufferedReader bfr = new BufferedReader(fr);
BufferedWriter bfw = new BufferedWriter(fw);
其实就是 fr.read()-->bfr缓冲数组--->读写动作--->bfw缓冲数组-->fw.read();//大神帮确定下是不是这样
那原来只有
FileReader fr = new FileReader("aa.txt");
FileWriter fw = new FileWriter("bb.txt");

的时候应该是
fr.read()-->缓冲数组-->fw.read();//同上,大神帮确定下是不是这样.

我感觉一样的缓冲效果为什么要用Buffered呢?


莫非这就是老毕说的修饰模式 让更多的Reader都来用Buffered统一实现缓冲技术 ?不改纠结于以上问题是不是

评分

参与人数 1技术分 +1 收起 理由
天黑偷牛 + 1 这才是提问

查看全部评分

13 个回复

倒序浏览
BufferedReader也是可以指定缓存数组大小的,用FileReader你还必须自己定义一个数组,BufferedReader内部是自动定义的,而且BufferedReader也添加了许多附加功能
回复 使用道具 举报
ysdolls 发表于 2014-8-29 14:41
BufferedReader也是可以指定缓存数组大小的,用FileReader你还必须自己定义一个数组,BufferedReader内部是 ...

那FileReader自己的数组实现的缓冲应该和BufferedReader差不多吧 我就是有点纠结于 二者单单功能上的区别 如果没有根本上的区别 只是套了一层的话我就释然了
回复 使用道具 举报
ysdolls 发表于 2014-8-29 14:41
BufferedReader也是可以指定缓存数组大小的,用FileReader你还必须自己定义一个数组,BufferedReader内部是 ...

还有我上面写的两种实现缓冲的过程应该没问题吧?
回复 使用道具 举报
我个人理解:
缓冲区就是封装了读  ,写,  数组三个功能的技术;而且是根据硬盘上的标记结束 读的过程,通过flush方法写进硬盘另一个区域;
只要把流(字节流,字符流)相关的文件传给缓冲区,则  读-->存储-->写 这一系列动作都是缓冲技术完成的;
查阅API可知,缓冲技术中的BufferedRead是封装了数组的,BufferedWrite是没数组的只有刷新数据进硬盘区域的功能...
回复 使用道具 举报
我的理解就是BufferedReader就是一个装饰类。附加包装了一些功能,减少代码量用的,同是新人,说的可能不对
,还有复制文件用管道流就好,不然你读取到一个数组中,又从这个数组放到了另外一个数组,然后才写入文件。这样很麻烦吧
回复 使用道具 举报
郑飞 高级黑马 2014-8-29 15:01:43
7#
本帖最后由 郑飞 于 2014-8-29 15:04 编辑
思如涌泉 发表于 2014-8-29 14:47
我个人理解:
缓冲区就是封装了读  ,写,  数组三个功能的技术;而且是根据硬盘上的标记结束 读的过程,通过flu ...

嗯 谢谢你的回答 有所帮助 最后还有个疑问 就是BufferedInputStream从自身数组取出一个字节 然后BufferedOutputStream接收一个 然后它是怎么处理这个字节的 是不是通过write方法一层一层的到最里面的out.write()方法让系统写入 因为能力有限所以看API和源代码有些地方不是太明白
回复 使用道具 举报
郑飞 高级黑马 2014-8-29 15:02:58
8#
ysdolls 发表于 2014-8-29 14:54
我的理解就是BufferedReader就是一个装饰类。附加包装了一些功能,减少代码量用的,同是新人,说的可能不对 ...

嗯 有帮助 谢谢解答
回复 使用道具 举报
郑飞 发表于 2014-8-29 14:44
那FileReader自己的数组实现的缓冲应该和BufferedReader差不多吧 我就是有点纠结于 二者单单功能上的区别 ...

毕老师在讲自定义字节流缓冲区的时候说,“当然老师不会写它的源码,它源码比较复杂,咱写个咱的得了,演示一个基本思想”。
回复 使用道具 举报
付江涛 发表于 2014-8-29 15:17
毕老师在讲自定义字节流缓冲区的时候说,“当然老师不会写它的源码,它源码比较复杂,咱写个咱的得了,演 ...

{:3_68:}也看到这个视频了 现在理解应该是一样的原理 后面老毕接着就讲了 修饰和模式 估计就是说明缓冲流存在的道理了
回复 使用道具 举报
郑飞 发表于 2014-8-29 15:01
嗯 谢谢你的回答 有所帮助 最后还有个疑问 就是BufferedInputStream从自身数组取出一个字节 然后BufferedO ...

"是不是通过write方法一层一层的到最里面的out.write()方法让系统写入?"

这句话我不理解啊, 既然jvm可以在本地系统使用,那么jvm的方法调用就有相应的结果,难道还要沟通本地系统的方法?
BufferedOutputStream 和FileOutpuStream 都继承OutputStream, 那么可以理解write方法就是父类的方法,FileOutputStream是个流,,相当于桥关联文件的作用;
另外输出的缓冲区也是封装了数组的,我上一次回复弄错了
回复 使用道具 举报
本帖最后由 郑飞 于 2014-8-30 07:36 编辑
思如涌泉 发表于 2014-8-29 16:29
"是不是通过write方法一层一层的到最里面的out.write()方法让系统写入?"

这句话我不理解啊, 既然jvm可以 ...

操作硬盘数据好像就是系统来执行 源代码中native修饰的那些read()方法就不是java自己实现的 是基于平台的好像  嗯 我也看到了 缓冲区是有数组 还有 字节缓冲流 最后是不用刷新的 缓冲数组满后write会自动刷新
回复 使用道具 举报
我是来学习的,加深理解,我也有和楼主一样的困惑,Buffered里面封装了一个数组,不用再另外定义了。。。。
回复 使用道具 举报
写的不错,!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马