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, 可以调高读取效率,但是没有说为何提高,如何提高,
那么问题就来了:
挖掘机技术到底哪家强?

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

32 个回复

正序浏览
来学习~
回复 使用道具 举报
采纳的回答,果然很给力,学到了
回复 使用道具 举报
问题都没看到!
回复 使用道具 举报
java核心技术卷二13页:“在javaSE5.0之前,处理文本输入的唯一方式就是通过BufferReader类,它拥有一个readLine方法可以使我们读入一行文本。你需要将带缓冲区的读入器与输入源组合起来

oracle api :Reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.***Without buffering, each invocation of read() or readLine() could cause bytes to be read from the file, converted into characters, and then returned, which can be very inefficient.

所以BufferReader是不能直接从文件读数据的,只能从字符流里面读数的。
回复 使用道具 举报
君子无醉 发表于 2015-6-8 01:01
我觉得 老师让你再想想的原因,可能是你把char[]数组说成了byte[]数组。因为包装的是字符流。。 ...

说到点子上去了
回复 使用道具 举报
wgy 中级黑马 2015-6-17 08:04:35
26#
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
例如,
BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化。
  其中构造方法主要有两个:
   BufferedReader(Reader in),这是指创建一个使用默认大小输入缓冲区的缓冲字符输入流。
   BufferedReader(Reader in, int sz),z这是指创建一个使用指定大小输入缓冲区的缓冲字符输入流。
   大概就是这样吧。

回复 使用道具 举报
这还真是 锱铢必较啊!
回复 使用道具 举报
学习了,赞赞赞.
回复 使用道具 举报
你对比一下API中的BufferedReader和Reader就会发现,他们唯一的区别是BufferedReader提供了ReadLine()允许一行一行的读的增强方法,提高每次读取的效率,老师主要是想让你说出ReadLine()是BufferedReader存在的意义
回复 使用道具 举报
其实要回答这个问题,直接拿MyBufferedReader的设计思路去问答就好了。要是问,为什么高效,就说利用缓存减少了IO切换
回复 使用道具 举报
搞的好乱啊,都很有道理的样子,但我觉得不需要纠结这个啊,讲明白原理就行了,没啥服气不服气的
回复 使用道具 举报
as604049322 发表于 2015-6-7 16:28
我的回答是:当BufferedReader在读取文本文件时,会先从文件中读入数据,并置入其所提供的缓冲区,
然后后 ...

:o 厉害,赞!!!
回复 使用道具 举报
探究的很深啊,要是我,我跟楼主回答的也一样
回复 使用道具 举报
感觉自己学的好不扎实
回复 使用道具 举报
本帖最后由 小田 于 2015-6-8 23:57 编辑

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

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

这个是BbufferedReader的源码的一部分

这个是BbufferedReader的源码的一部分
回复 使用道具 举报
我表示路过,没有学到那步
回复 使用道具 举报
来学习:victory:
回复 使用道具 举报
流的一章,学的也很混乱
回复 使用道具 举报
as604049322 发表于 2015-6-7 16:28
我的回答是:当BufferedReader在读取文本文件时,会先从文件中读入数据,并置入其所提供的缓冲区,
然后后 ...

学习了!!!赞
回复 使用道具 举报
君子无醉 来自手机 中级黑马 2015-6-8 01:01:52
12#
我觉得 老师让你再想想的原因,可能是你把char[]数组说成了byte[]数组。因为包装的是字符流。。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马