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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

13黑马币
本帖最后由 2666fff 于 2015-6-7 13:46 编辑

提高悬赏,来个官方正式点的回答。没人答出为什么我说的不对,我就一直加悬赏。


我的回答是:当BufferedReader在读取文本文件时,会先从文件中读入数据,并置入其所提供的缓冲区,
然后后面的byte[] 数组br.read()方法,会先从缓冲区中进行读取。
然后老师说让我在好好想想,因为当时还专门看过这个,于是我觉得我赵日天不服。


然后我goolge了一下,发现对于这个网络上有两种解释:
1. java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。

来源
http://xyiyy.iteye.com/blog/361476
这个基本跟我说的一样。


第二种:
这么说吧,这个类就是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的。

来源:

http://zhidao.baidu.com/link?url=53hXzhh70y4Dny5w9faS2pIPdrLc1vZnccZNEoLtzKi-vCa7KnzNOZMH-ZPBUPvIf0wBo0WrIl9YPsvkHaSBJa
这个没提到之后从缓冲区再怎么read,所以我就不是很明白了。

再查看java 自带API:
java.io
Class BufferedReader
public class BufferedReader
extends Reader
Reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.
The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.

api中也只说了,它提供足够大的buffer,用来buffering characters, 可以调高读取效率,但是没有说为何提高,如何提高,
那么问题就来了:
挖掘机技术到底哪家强?

回答的请专业点,一两行就觉得能完事的就不要来了,回答的好有加分哦。
最好当时面试的那个男老师能来帮我解答一下。

最佳答案

查看完整内容

我的回答是:当BufferedReader在读取文本文件时,会先从文件中读入数据,并置入其所提供的缓冲区, 然后后面的char[] 数组br.read()方法,会先从缓冲区中进行读取。 -------------------------------------------------------------------------------------- 楼主不说清楚老师问了什么,,还我们得分析加猜测老师问了啥,,想半天。。 我猜老师应该是问: ---------------------------------------------------------------------- ...

32 个回复

倒序浏览
本帖最后由 as604049322 于 2015-6-8 11:13 编辑

我的回答是:当BufferedReader在读取文本文件时,会先从文件中读入数据,并置入其所提供的缓冲区,
然后后面的char[] 数组br.read()方法,会先从缓冲区中进行读取。
--------------------------------------------------------------------------------------
楼主不说清楚老师问了什么,,还我们得分析加猜测老师问了啥,,想半天。。
我猜老师应该是问:
-------------------------------------------------------------------------
BufferedReade高效的原理是什么???
任何流底层从磁盘读取数据都是一次读一个字节,如果读一个字节之后马上要写数据这样就需要移动磁头,而移动磁头的时间远远高于读取的时间。而有时我们一次把所有内容读入到内存,空间又不够,,于是设计了BufferedReader等缓冲区的类,其实所谓的缓冲区底层就是一个数组,为了减少频繁移动磁头带来的时间消耗,BufferedReader在调用read方法读取数据时,,会首先检查数组里面是否存在已经读取的数据,若不存在则从底层流读取数组长度的字符保存起来。若存在则直接返回数组中的字符。这个问题我感觉我用文字很难说清楚,,所以只说了最简单的情况。
------------------------------------------------------------------------------------------------------
再说说你的回答,,,我先跟你改一改
当BufferedReader在读取文本文件时,会先判断缓冲区是否存在数据,若不存在则会从文件中读入数据,并保存到char[]数组(缓冲区)中,以前不断调用read()方法读取字符时,都会不断的判断,并调整指针位置,直到缓冲区为空时,又会从文件读取数据到缓冲区。


就算你心里时这么想的,,但回答的太笼统,,看不出这层意思。

如果你觉得你表达的够清楚,,真的把缓冲区搞懂了,,你就在老师面前写一个缓冲区出来,,说实话我的表达也还是不太清楚,,如果老师不认同我就会在他面前写个缓冲区出来,,证明自己的实力。

凡事想想自己的问题

点评

讲的很好  发表于 2015-6-12 22:17
回复 使用道具 举报
BufferedReader 是字符输入流缓冲区,这个类是采用装饰设计模式来设计的,在创建这个类的对象的时候,需要接收一个字符输入流对象,这样可以提高字符输入流读取数据的效率;
调用这个类的read方法 实际上是调用的创建该类对象的时候传进来的字符输入流的read方法,然后用read从源中读取数据 存放到这个类封装的字节数组,当调用该类的readerLine()实际上是从字节数组中读取的,没有直接从源中读取数据 而是从内存中读取数据 所以效率很高;
回复 使用道具 举报
本帖最后由 开弓没有回头箭 于 2015-6-6 09:33 编辑

bufferedReader要与bufferdWriter配合使用才有意义。如果只是读出来,打印到控制台,bufferedReader和Reader没有太大差别。
bufferedReader的出现是为了避免这样的情况:Reader是读取一个字符,Writer写一个字符,没有bufferedReader的情况下,Reader一个字符就要Writer一个,对硬盘来讲,磁头读取一个字符,必须去找磁盘上到写的地方,写一个字符。如果是长的字符串,磁头就必须在读的区域和写的区域来回移动,因此效率的。bufferedReader就是把要读取的字符串先读完,在一次性写,避免磁头来回移动,以此来提高读写效率。也就是说可以自己定义一段缓存空间来保存Reader出来的数据,效果和bufferedReader一样
所以不涉及到硬盘这类外存的读写,bufferedReader对于提高效率没有什么效果,但因其提供的方便的读取方法,比如readLine方法,所以一般会用bufferedReader
回复 使用道具 举报
问的是什么问题啊?
回复 使用道具 举报
还牛逼呀
回复 使用道具 举报
忘了什么区别了
回复 使用道具 举报
xtf 中级黑马 2015-6-7 11:32:21
8#
Enhon1992 发表于 2015-6-5 20:24
BufferedReader 是字符输入流缓冲区,这个类是采用装饰设计模式来设计的,在创建这个类的对象的时候,需要 ...

认真学习下!
回复 使用道具 举报
xtf 发表于 2015-6-7 11:32
认真学习下!

我说错了吗?
回复 使用道具 举报
xtf 发表于 2015-6-7 11:32
认真学习下!

我说错了吗?
回复 使用道具 举报
Enhon1992 发表于 2015-6-5 20:24
BufferedReader 是字符输入流缓冲区,这个类是采用装饰设计模式来设计的,在创建这个类的对象的时候,需要 ...

我跟你解释的差不多吧:
然后用read从源中读取数据 存放到这个类封装的字节数组,没有直接从源中读取数据 而是从内存中读取数据 所以效率很高;

可是老师为什么让我好好想想? 这论坛有没有官方的人来回答这个问题?
回复 使用道具 举报
说还真是不好说呀。
回复 使用道具 举报
君子无醉 来自手机 中级黑马 2015-6-8 01:01:52
13#
我觉得 老师让你再想想的原因,可能是你把char[]数组说成了byte[]数组。因为包装的是字符流。。
回复 使用道具 举报
as604049322 发表于 2015-6-7 16:28
我的回答是:当BufferedReader在读取文本文件时,会先从文件中读入数据,并置入其所提供的缓冲区,
然后后 ...

学习了!!!赞
回复 使用道具 举报
流的一章,学的也很混乱
回复 使用道具 举报
来学习:victory:
回复 使用道具 举报
我表示路过,没有学到那步
回复 使用道具 举报
本帖最后由 小田 于 2015-6-8 23:57 编辑

“当BufferedReader在读取文本文件时,会先从文件中读入数据,并置入其所提供的缓冲区,”这句话没问题,我看了BufferedReader的源码,他自身 有一个自带的私有化的字符数组,

L`29MLFMSMKSQS}JH$1F4BE.png (12.75 KB, 下载次数: 179)

这个是BbufferedReader的源码的一部分

这个是BbufferedReader的源码的一部分
回复 使用道具 举报
感觉自己学的好不扎实
回复 使用道具 举报
探究的很深啊,要是我,我跟楼主回答的也一样
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马