Java bufferedreader和filereader之间的具体区别

Java bufferedreader和filereader之间的具体区别,java,bufferedreader,filereader,Java,Bufferedreader,Filereader,我想知道BufferedReader和FileReader之间的具体区别 我确实知道,BufferedReader比FileReader更有效,但有人能解释一下原因吗(具体和详细)?谢谢。Bufferedreader—您实际上可以使用它来代替Scanner方法,获取文件,获取输入 FileReader-顾名思义。FileReader-读取字符文件 BufferedReader—“从字符输入流读取文本,对字符进行缓冲,以便有效读取字符、数组和行。” 实际上,BufferedReader使用像F

我想知道
BufferedReader
FileReader
之间的具体区别


我确实知道,
BufferedReader
FileReader
更有效,但有人能解释一下原因吗(具体和详细)?谢谢。

Bufferedreader—您实际上可以使用它来代替Scanner方法,获取文件,获取输入


FileReader-顾名思义。

FileReader-读取字符文件

BufferedReader—“从字符输入流读取文本,对字符进行缓冲,以便有效读取字符、数组和行。”


实际上,BufferedReader使用像FileReader这样的读卡器。

方法很简单:

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

非常详细

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

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

BufferedReader stdin =
    new BufferedReader(new InputStreamReader( System.in ));
这些行创建一个BufferedReader,但将其连接到键盘的输入流,而不是文件


来源:

BufferedReader需要一个读卡器,其中FileReader是其中之一-它从InputStreamReader派生,它是从读卡器派生的。

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

首先,您应该理解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的花花公子们增加了另一个引人注目的功能“在处理之前创建数据缓冲区。”

当用户在YouTube上传输视频时,这个概念非常相似。视频在播放前进行缓冲,以提供完美的视频观看体验。(Tho,浏览器保持缓冲,直到整个视频提前缓冲。)BufferedReader类也使用同样的技术

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

当向BufferedReader对象发出“读取”指令时,它使用FileReader对象从文件中读取数据。当给出指令时,FileReader对象一次读取2(或4)个字节,并将数据返回到BufferedReader,读取器将继续执行此操作,直到它到达“\n”或“\r\n”(行符号的末尾)。 缓冲一行后,读取器耐心等待,直到给出缓冲下一行的指令

同时,BufferReader对象创建一个特殊的备忘录
BufferedReader br = new BufferedReader( new FileReader("example.txt") );
// this variable points to the buffered line
String line;

// Keep buffering the lines and print it.
while ((line = br.readLine()) != null) {
    printWriter.println(line);
}
// Object that reads console inputs
InputStreamReader console = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(console);
System.out.println(br.readLine());
 bufferedReader.readLine();