我对BufferedReader与FileReader的工作方式有疑问。研究了关于stackoverflow和Google的大多数帖子,但我的疑问仍然没有消除。这是我第三天穿上这衣服来了解..! :)

这里是:

我的理解是,当我们使用以下代码段时

 BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));


FileReader读取按字节的数据并将其放入缓冲区。此处,缓冲区由BufferedReader创建,并且BufferedReader的实例从该缓冲区读取。

这让我开始思考,因为这篇文章说Understanding how BufferedReader works in Java,BufferedReader本身并不存储任何内容,因为如果是这种情况,那么我认为BufferedReader会做两件事,一个创建一个缓冲区,第二个创建一个从该缓冲区读取的BufferedReader实例。 。!说得通...?

我的第二个疑问是,可以使用BufferedReader来避免IO操作,这意味着避免了费时的工作,即先从磁盘读取字节,然后将其转换为Char,然后再释放字节。因此,要克服此问题,可以使用BufferedReader一次读取大块数据。这里让我认为,当BufferedReader包裹在FileReader周围时,则首先读取FileReader流,然后将数据传递到BufferedReader。那怎么需要大块钱...?

我的理解是,BufferedReader读取器很有用,因为它从作为内存的Buffer中读取数据,因此与其在从磁盘读取字节并同时进行转换的同时做同样的事情,首先将所有字节放入缓冲区或内存中然后读取它可以从那里读取,因为它的读取速度很快,也可以转换为char。我已经通过在线阅读得出了结论,但是不同意100%,因为即使在放入缓冲区后也没有跳过任何步骤,那么它如何减少时间框架....? :(

我真的对这些感到困惑,有人可以帮助我更准确地理解这一点吗?

最佳答案

FileReader读取字节数据


否。它构造一个FileInputStreamInput Reader,并从后者读取作为字符。


  并放入缓冲区


放入呼叫者的缓冲区。


  这里的缓冲区是由BufferedReader创建的,并且BufferedReader的实例从该缓冲区读取。


正确。


  这让我思考,因为这篇文章说Understanding how BufferedReader works in Java,BufferedReader本身不存储任何内容


那篇文章中的陈述是完整的,完全是胡说八道,其他任何来源也是如此。当然,它存储数据。它是一个缓冲区。请参阅Javadoc,尤其是以下语句:“从字符输入流中读取文本,缓冲字符[我的重点],以便有效地读取字符,数组和行。”


  因为如果是这种情况,那么我认为BufferedReader做两件事,一个创建一个缓冲区,第二个创建从该缓冲区读取的BufferedReader实例...!说得通...?


不,但您的消息来源也没有。上面的第一个直觉是正确的。


  我的第二个疑问是,BufferedReader可用于避免IO操作,这意味着避免了从磁盘读取字节然后将其转换为Char然后给出字节的费时的工作。因此,要克服此问题,可以使用BufferedReader一次读取大块数据。这里让我认为,当BufferedReader包裹在FileReader周围时,则首先读取FileReader流,然后将数据传递到BufferedReader。那怎么需要大块钱...?


通过为FileReader.read()提供较大的缓冲区。


  我的理解是,BufferedReader读取器很有用,因为它从作为内存的Buffer中读取数据,因此与其在从磁盘读取字节并同时进行转换的同时做同样的事情,首先将所有字节放入缓冲区或内存中然后读取它可以从那里读取,因为它的读取速度很快,也可以转换为char。我已经通过在线阅读得出了结论,但是不同意100%,因为即使在放入缓冲区后也没有跳过任何步骤,那么它如何减少时间框架....? :(


跳过了从磁盘逐字符读取的步骤。从磁盘文件中读取数据块的效率与读取一个字节差不多,并且系统调用本身也很昂贵。

关于java - 使用FileReader的BufferedReader,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50313245/

10-12 06:28