bufferedreader 和 filereader 的具体区别

Posted

技术标签:

【中文标题】bufferedreader 和 filereader 的具体区别【英文标题】:Specific difference between bufferedreader and filereader 【发布时间】:2012-03-27 18:35:44 【问题描述】:

我想知道BufferedReaderFileReader之间的具体区别。

我知道BufferedReaderFileReader 效率更高,但有人可以解释一下为什么(具体和详细)吗?谢谢。

【问题讨论】:

【参考方案1】:

Bufferedreader - 您可以实际使用的方法来替代 Scanner 方法,获取文件,获取输入。

FileReader - 顾名思义。

【讨论】:

【参考方案2】:

FileReader - 读取字符文件

BufferedReader - “从字符输入流中读取文本,缓冲字符,以便高效读取字符、数组和行。”

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

http://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html

实际上 BufferedReader 使用了像 FileReader 这样的 Reader。

【讨论】:

【参考方案3】:

简单来说:

FileReader 类是从文件中读取字符的通用工具。 BufferedReader 类可以包裹 Reader,如 FileReader,以缓冲输入并提高效率。因此,您不会使用另一个,而是通过将 FileReader 对象传递给 BufferedReader 构造函数来同时使用两者。

非常详细

FileReader 用于从磁盘文件输入字符数据。输入文件可以是普通的 ASCII,每个字符文本文件一个字节。 Reader 流自动将字符从磁盘文件格式转换为内部字符格式。输入文件中的字符可能来自 UTF 格式支持的其他字母,在这种情况下,每个字符最多三个字节。在这种情况下,文件中的字符也会被转换为 char 格式。

与输出一样,使用缓冲区来提高效率是一种很好的做法。为此使用 BufferedReader。这与我们一直用于键盘输入的类相同。这些行应该看起来很熟悉:

BufferedReader stdin =
    new BufferedReader(new InputStreamReader( System.in ));

这些行创建了一个 BufferedReader,但将其连接到键盘的输入流,而不是文件。

来源:http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html

【讨论】:

【参考方案4】:

BufferedReader 需要一个 Reader,其中 FileReader 是其中之一 - 它源自 InputStreamReader,后者源自 Reader。

【讨论】:

【参考方案5】:

FileReader 类有助于写入文件,但它的效率很低,因为它一次从文件中检索一个字符,但是 BufferedReader 获取数据块并将其存储在缓冲区中,因此而不是从文件检索中一次检索一个字符变为易于使用缓冲区。

【讨论】:

【参考方案6】:

首先,您应该了解 Java 中的“流式传输”,因为 Java 中的所有“阅读器”都建立在这个概念之上。

文件流式传输

文件流由Java中的FileInputStream对象进行。

// it reads a byte at a time and stores into the 'byt' variable
int byt;
while((byt = fileInputStream.read()) != -1) 
    fileOutputStream.write(byt);
 

此对象一次读取一个字节(8 位)并将其写入给定文件。

它的一个实际有用的应用是处理原始二进制/数据文件,例如图像或音频文件(使用 AudioInputStream 而不是 FileInputStream 处理音频文件)。 另一方面,对于文本文件来说非常不方便且速度较慢,因为一次循环一个字节,然后进行一些处理并将处理后的字节存储回来既繁琐又耗时。

您还需要提供文本文件的字符集,即字符是拉丁文还是中文等,否则程序会解码和编码一次 8 位,您会看到奇怪的字符打印在屏幕上或写入输出文件(如果字符长度超过 1 个字节,即非 ASCII 字符)。

文件读取

这只是一种带有包容性字符集支持的“文件流式传输”的奇特方式(即不需要像之前那样定义字符集)。

FileReader 类专门用于处理文本文件。 如您之前所见,文件流处理最好处理原始二进制数据,但对于文本而言,效率并不高。

所以 Java 大佬添加了 FileReader 类,专门处理文本文件。它一次读取 2 个字节(或 4 个字节,取决于字符集)。与前面的 FileInputStream 相比有了显着的巨大改进!!

所以流式操作是这样的,

int c;
while ( (c = fileReader.read()) != -1)  // some logic 

请注意,这两个类都使用一个整数变量来存储从输入文件中检索到的值(因此每个字符在获取时转换为整数,在存储时又转换为字符)。

这里唯一的好处是这个类只处理文本文件,所以你不必指定字符集和其他一些属性。它为大多数文本文件处理案例提供了一个开箱即用的解决方案。它还支持国际化和本地化。

但它仍然很慢(一次读取 2 个字节并循环遍历它!)。

缓冲流

为了解决连续循环超过一个或 2 个字节的问题。Java-dudes 添加了另一个惊人的功能。 “在处理之前创建数据缓冲区。”

当用户在 YouTube 上流式传输视频时,这个概念非常相似。视频在播放前被缓冲,以提供完美的视频观看体验。 (不过,浏览器一直在缓冲,直到整个视频被提前缓冲。) BufferedReader 类使用了相同的技术。

BufferedReader 对象将 FileReader 对象作为输入,其中包含有关需要读取的文本文件的所有必要信息。 (例如文件路径和字符集。)

BufferedReader br = new BufferedReader( new FileReader("example.txt") );

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

同时,BufferReader 对象创建了一个特殊的内存位置(在 RAM 上),称为“缓冲区”,并存储从 FileReader 对象获取的所有数据。

// this variable points to the buffered line
String line;

// Keep buffering the lines and print it.
while ((line = br.readLine()) != null) 
    printWriter.println(line);

现在在这里,不是一次读取 2 个字节,而是获取一整行并将其存储在 RAM 中的某个地方,当您处理完数据后,您可以将整行存储回硬盘。因此,它使进程的运行速度比一次运行 2 个字节快。

但是,为什么我们需要将 FileReader 对象传递给 BufferReader?我们不能只说“缓冲这个文件”,而 BufferReader 会处理剩下的事情吗?那不是很甜蜜吗?

嗯,BufferReader 类的创建方式只知道如何创建缓冲区和存储传入数据。它与数据来自的对象无关。因此,同一个对象可以用于许多其他输入流,而不仅仅是文本文件。

也就是说,当您提供 FileReader 对象作为输入时,它会缓冲文件,就像您提供 InputStreamReader 作为对象时一样,它会缓冲终端/控制台输入数据直到遇到换行符。比如,

// Object that reads console inputs
InputStreamReader console = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(console);
System.out.println(br.readLine());

这样,您可以使用相同的 BufferReader 类读取(或缓冲)多个流,例如文本文件、控制台、打印机、网络数据等,您只需要记住,

 bufferedReader.readLine();

打印您缓冲的任何内容。

【讨论】:

谢谢!我只是想解释一些复杂的概念! :) 非常好的解释,彻底解开了我的疑惑。 :) 太棒了!这比我从文档中读到的要清楚得多 不错的答案,但我认为您的最后一行代码不正确。 BufferedReader 接收一个Reader 对象。 System.in 是一个输入流。检查接受的答案。 很好的解释。在阅读了几个文件后,我不明白这个概念。但我只是通过阅读你的解释得到了这个概念。非常感谢。

以上是关于bufferedreader 和 filereader 的具体区别的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要同时关闭() FileReader 和 BufferedReader?

java中BufferedReader和FileReader怎么用?

Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区

Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和区别

IO BufferedReader+FileReader

JAVA中常用IO流类:BufferedReader和BufferedWriter读取文件操作(优势:使用BufferedReader读取字符文件的速度要比我们之前使用的字节流和FileReader快