BufferedReader读取的字节数

时间:2018-12-31 09:30:25

标签: java

据我所知,缓冲读取器比未缓冲读取器进行了优化,因为每次读取都将从内存中进行,而无需每次都从磁盘/网络进行I / O读取/写入。

所以我在这里阅读答案:

Specific difference between bufferedreader and filereader

第二个答案似乎让我感到困惑:

  

将“ read”指令提供给BufferedReader对象时,它使用FileReader对象从文件中读取数据。发出指令后,FileReader对象一次读取2(或4)个字节,并将数据返回给BufferedReader,并且读取器一直这样做,直到命中'\ n'或'\ r \ n'(线符号)。一旦缓冲了一行,阅读器就会耐心等待,直到给出缓冲下一行的指令为止。

那是正确的吗?我认为我们失去了关于缓冲区读取器的整个想法,如果缓冲区需要读取多个2个字节,那么我可以使用文件读取器,也可以使用它。缓冲读取器的想法是一次应读取大块数据,因此I / O访问次数将大大少于文件读取器。

如果我错了,谁能纠正我?

2 个答案:

答案 0 :(得分:1)

看看BufferedReader javadoc

从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。 可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。 通常,由读取器发出的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议将BufferedReader包装在其read()操作可能会很昂贵的任何Reader周围,例如FileReaders和InputStreamReaders。例如,
 BufferedReader in = new BufferedReader(new FileReader("foo.in"));
将缓冲来自指定文件的输入。如果不进行缓冲,则每次调用read()或readLine()都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能会非常低效。 通过使用适当的BufferedReader替换每个DataInputStream,可以本地化使用DataInputStreams进行文本输入的程序。

因此,它会预先缓冲来自底层资源的数据,随后的read指令将缓冲区用于提高效率。

答案 1 :(得分:0)

他的意思是FileInputStream一次读取N个字节,并且对读取的数据不感兴趣。 BufferedReader最终使用FileInputStream(在读取文件时)并重复读取部分,但是它确实对读取的字节感兴趣,将其视为字符数据(编码注意事项等),将它们分成几行

当然,您可以编写自己的代码,而不使用BufferedReader,但是您可以对计算中的任何内容说相同的话:“我不喜欢NVidia的显示驱动程序,所以我坐了3年时间编写自己的代码。我正在启动一个新的操作系统。当量子计算机成为主流时就可以完成。”-几乎没有人这样做。这就是所谓的“重新发明轮子”,这是我们不这样做的一个原因:在大多数情况下,其他人发明的轮子对于我们的目的/已经比我们有时间做自己的时间还好

注意;您似乎对BufferedReader最终一次从数据源读取一个字节或两个字节的断言表示怀疑。可能不是,但是我不认为这是该人提出的重点(帖子中使用的语言相当模糊)。不管它如何从InputStream / Reader读取字节,BufferedReader都会在寻找换行符时逐个字符地检查它读取的数据,因此可以使ReadLine()正常工作。它将独立于读取文件的策略来执行此操作(也许它反复读取4096字节的块,但在解释数据时肯定必须逐字节处理数据)

最终考虑到文件访问已缓存,并且读取的合并可能发生在多个级别:调用ReaderX.Read()几乎可以肯定不会导致硬盘停止其正在执行的所有操作,转到某个扇区,读取单个字节,然后返回之前的操作。因此,您可能会发出一百万次对Read()一个字符的调用,而该调用不会导致比单次调用Read()到兆字节缓冲区中引起更多的硬盘抖动