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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 游兴钟 中级黑马   /  2012-5-10 23:29  /  2507 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

既然Bufferedreader的提高效率原理就是内部封装了数组,而Filereader本身也有read(char[] char)这个char[]也是起到缓冲作用,那么使用Bufferedreader提效Filereader时还有必要用到read(char[] char)方法吗?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
可以使用,但是,java语言是面向对象的语言,这里就体现出来了
   既然BufferedReader中封装了数组,我们为什么不直接拿过来用呢?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先需要说明的是:Java内部封装了的类或者方法或者数据结构,都有它需要实现的目标。

因此,我想既然java提供了BufferedReader和BufferedWriter这两个流,的确是用来提高效率的。
流在默认的情况下是不被缓冲区缓存的,也就是说,每个read的调用都会请求操作系统再分发一个字节。
FileReader里传的参数虽然是char[] 但是也是调用FileReader的read方法,一次读入一个字节,只是存放的方式是一个数组。
这样来回的对操作系统进行请求是有代价的,起码是有时间开销的。
另外也影响了操作系统对作业的分配情况,当操作系统将资源分配给FileReader 流中read的时候,就会延缓其他作业的分配。

说到这里,楼主应该明白为什么要用缓冲机制了吧。
缓冲机制封装了一个缓冲区,使得数据都缓存在buffer里,一次性分配多个字节,从而减少了请求CPU的次数。

当然,没有一种机制是有绝对的好处而没有弊端的。缓存区虽然节约了系统的时间开销,但是开辟了新的空间,有新的空间代价。

希望能解答楼主的疑惑。呵

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
一楼二楼说的都是正解。
BufferedReader之所以高效,是因为它有一个readLine()方法。查看一下源码,可以看到它的内部封装了一个StringBuffer容器。将独到的字符全部续写到StringBuffer中,在一次性的返回。
它所做的就是将read(char[] chars)的提出来,单独封装成一个对象,方便操作。这里就是java中的装饰模式。
建议在回头看看毕老师的<19-07-装饰和继承>,这节视频。看完之就能彻底解决你的遗憾了。
回复 使用道具 举报
云惟桉 发表于 2012-5-11 00:52
首先需要说明的是:Java内部封装了的类或者方法或者数据结构,都有它需要实现的目标。

因此,我想既然java ...

可是即便是BufferedReader,归根结底还是使用了read()方法,只是比普通的FileReader内部多封装了数组而已。在使用其进行缓冲的时候CPU的请求次数会有什么变化?
回复 使用道具 举报
achilles 发表于 2012-5-11 04:00
可是即便是BufferedReader,归根结底还是使用了read()方法,只是比普通的FileReader内部多封装了数组而 ...

嗯,是用的read方法没错,但是BufferedReader已经把Reader里的read方法覆盖了。
因此,read方法针对的对象已经不一样了,楼主发现了吗?

Reader类中read方法,是从文件中进行读取
BufferedReader中的read方法,是从缓冲区进行读取的。
对于BufferedReader进行读取之前,它已经实现了数据从文件到缓冲区的集中添加。直到数据量达到缓冲区的大小的时候,或者数据写到结尾的时候,才开始切换到读取操作,而这里说的读取,是从缓冲区中进行读取。

楼主如果想了解更多更多,可以参看API,里面对某几个read方法讲解还算很到位的,自己再琢磨琢磨,问题应该就可以解决了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马