我想知道BufferedReader
和FileReader
之间的具体差异。缓冲读取器和文件读取器之间的特定差异
我知道BufferedReader
更有效率,而不是FileReader
,但有人可以解释为什么(具体和详细)?谢谢。
我想知道BufferedReader
和FileReader
之间的具体差异。缓冲读取器和文件读取器之间的特定差异
我知道BufferedReader
更有效率,而不是FileReader
,但有人可以解释为什么(具体和详细)?谢谢。
以简单的方式:
甲的FileReader类是从文件中的字符读取的通用工具。 BufferedReader类可以包装读者,如FileReader,以缓冲输入并提高效率。所以你不会使用另一个,但同时通过将FileReader对象传递给BufferedReader构造函数。
非常详细
的FileReader用于从一个磁盘文件的字符数据的输入。输入文件可以是普通的ASCII,每个字符文本文件一个字节。 Reader流自动将字符从磁盘文件格式转换为内部字符格式。输入文件中的字符可能来自UTF格式支持的其他字母,在这种情况下,每个字符最多有三个字节。在这种情况下,文件中的字符也会转换为字符格式。
与输出,它是使用一个缓冲器,以提高效率好的做法。为此使用BufferedReader。这是我们用于键盘输入的相同类。这些线路很熟悉:
BufferedReader stdin =
new BufferedReader(new InputStreamReader(System.in));
这些行创建一个BufferedReader,但它会从键盘连接到一个输入流,而不是一个文件。
来源:http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html
Bufferedreader - 实际上可以用作Scanner方法的替代方法,获取文件,获取输入的方法。
FileReader - 顾名思义。
的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读者。
的BufferedReader需要一个阅读器,其中的FileReader是一个 - 它从InputStreamReader的,从阅读器下降下降。
FileReader类有助于写入文件,但效率很低,因为它一次只能从文件中检索一个字符,但BufferedReader接收大量数据并将其存储在缓冲区中,因此不会从文件检索中一次检索一个字符使用缓冲区变得容易。
首先,你应该明白在Java的流媒体,因为所有的“读者”在Java是基于这个概念建立。
文件流媒体
文件流媒体是由Java中的的FileInputStream对象进行的。
// it reads one byte at a time and stores into the 'byt' variable
int byt;
while((byt = fileInputStream.read()) != -1) {
fileOutputStream.write(byt);
}
该对象实际上每次读取一个字节(8位)并将其写入给定文件。
一个实际应用是,当你与原始二进制/数据文件,如图像或音频文件(使用的AudioInputStream代替的FileInputStream音频文件)工作。 在另一方面为文本文件,这是非常不方便,更慢,因为通过一次一个字节的循环,然后做一些处理和存储字节后面是繁琐和耗时。
您还需要提供字符集(如果角色是拉丁或中国等)的文本文件,你正在处理的,高效的编码和解码,否则,程序会解码和编码一些乱码,你会看到在你的文本文件中写出了一大堆奇怪的符号。
文件读取
这只是说“文件流”与字符集支持的一个奇特的方式。
FileReader类是专门为处理文本文件而设计的。 正如前面所看到的,文件流媒体是最好对付的原始二进制数据,但对于文本的缘故,它是没有效率。
所以Java家伙增加了文件读取器类,专门处理文本文件。这一次读取2个字节(在的FileInputStream一个巨大的进步!我想说的话还是比较好的选择流字节)。
所以操作是,
int c;
while ((c = fileReader.read()) != -1) { // some logic }
请注意,两个实例都使用整数变量来存储从输入文件中检索的值。
唯一的好处是,由于这个类处理文本文件,所以你不必指定文本文件的字符集和其他一些属性。它基本上为大多数情况提供了一个开箱即用的解决方案。它还支持国际化和本地化。
但同样它还是比较慢的方式(成像读2个字节的时间,并通过它循环!)。
缓冲流
要通过Java的人增加了一个显着的功能,一个字节或2解决连续循环的问题。 “在处理之前创建一个缓冲区。“
这个概念与用户在YouTube上播放视频非常相似,视频在播放之前进行缓冲,因此人们获得完美的视频观看体验(并保持缓存直到整个视频在时间,而你看。)
同样的技术被用于由的BufferedReader班,的BufferedReader对象需要的FileReader对象,它包含了所有需要被读取的文本文件中的信息。
The BufferReader object uses Filereader object to read the given text file。 每次文件读取器从文本文件中读取2个字节时,它将数据返回给缓冲读取器对象。现在,缓冲区读取器对象还会创建一个称为“缓冲区”的特殊存储位置,并将所有缓冲数据存储在那里。
BufferedReader br = new BufferedReader(new FileReader("example.txt"));
读取2个字节的时间的方法,不断重复,直至的FileReader对象命中, '\ n', '\ r \ n'(A新行字符),以及BufferReader停止缓冲。直到读取下一行(准确地说是缓冲下一行)的指令为止。
// 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类是哑类谁只是知道如何缓冲区的方式,它没有一个什么缓冲或者它根本不关心线索。 所以被说,当你提供的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();
打印您正在缓冲的任何内容。
很好的解释! – JavaDeveloper 2015-03-13 12:46:12
谢谢!我只是想解释一些复杂的概念! :) – 2015-03-15 02:25:14
真的很好的解释,它彻底清除了我的疑惑。 :) – 2016-01-05 06:07:50