bufferedreader和filereader之间的具体区别
我想知道BufferedReader
和FileReader
之间的具体区别。
我知道BufferedReader
比FileReader
更有效率,但有人可以解释为什么(具体而详细地)? 谢谢。
以简单的方式:
FileReader类是从文件读取字符的通用工具。 BufferedReader类可以包装读者,如FileReader,以缓冲input并提高效率。 所以你不会使用另一个,但同时通过FileReader对象传递给BufferedReader的构造函数。
非常详细
FileReader用于从磁盘文件input字符数据。 input文件可以是普通的ASCII,每个字符文本文件一个字节。 Readerstream自动将字符从磁盘文件格式转换为内部字符格式。 input文件中的字符可能来自UTF格式支持的其他字母,在这种情况下,每个字符最多有三个字节。 在这种情况下,文件中的字符也被转换为字符格式。
和输出一样,最好使用缓冲区来提高效率。 为此使用BufferedReader。 这是我们用于键盘input的同一个类。 这些线应该看起来很熟悉:
BufferedReader stdin = new BufferedReader(new InputStreamReader( System.in ));
这些行创build一个BufferedReader,但将其连接到键盘inputstream,而不是文件。
资料来源: http : //www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html
您应该了解Java中的stream式传输概念,因为Java中的所有读取器都是以此为基础构build的。
文件stream文件stream是由Java中的FileInputStream对象实例执行的。
// read byte by byte and store into this variable int byt; while((byt = fileInputStream.read()) != -1) { fileOutputStream.write(byt); }
这个对象实际上每次读取一个字节(8位)并将其写入给定文件。 当处理原始数据文件(例如图像或audio(相同但使用AudioInputStream对象)等)时很好,但是对于文本文件而言,这很不方便或较慢,因为它浪费了时间循环。 你还需要提供一个文本文件字符集,否则无论你写什么你都不会在文件中看到,你只会看到一些随机的文本和符号。
文件读取(基本上是用stringstream) FileReader用于文件读取,所以操作是,
int c; while ( (c = fileReader.read()) != -1) { // some logic }
而不是每次获取一个字节,它一次获取2个字节,但仍然运行与文件中的字符相同的次数。 但是,当处理文件时,比如“FileInputStream”字节stream动更好。 两个实例都使用整数variables来存储来自input文件的值。 字节stream将8位存储到一个variables中,而FileReader存储16位,但在这里,您不必指定文件的字符集和一些其他属性,它会自动为您执行此操作,并且还支持国际化。 但还是比较慢
缓冲stream现在文件缓冲比文件stream读取更快。 这与您在YouTube上看到的概念是一样的。 youtube在实际开始播放video之前会缓冲一些video,因此您可以拥有无暇的video观看体验。
因此,文件缓冲使用了BufferedReader对象实例,并且您需要指定要缓冲的stream,在这种情况下,它是一个文件,因此您需要传递FileReader对象。
BufferedReader br = new BufferedReader( new FileReader("example.txt") );
现在在这里,bufferedReader缓冲文件意味着它一直读取一个文件,直到它碰到'\ n','\ r \ n'(换行)字符并将提取的字符存储到一个string中并将其存储到缓冲区中)。
String line; while ((line = br.readLine()) != null) { printWriter.println(line); }
现在,您可以看到不是将每个字节或2个字节的值存储在一个intvariables中,而是将整行存储到内存中并对其进行处理。 但是缓冲区读取器不能单独工作,因为它只是缓冲,所以你需要指定你想缓冲的stream? 它可能是您之前看到的文件stream,或者可能是控制台,如
BufferedReader br = new BufferedReader(new inputStreamReader(System.in));
那么它将从控制台扫描整行。 这就是为什么在Java中使用bufferedReader.readLine()
来从控制台收集input的原因。
BufferedReader需要一个Reader,其中FileReader是一个 – 它是从Reader的后面的InputStreamReaderinheritance而来的。
FileReader – 读取字符文件
BufferedReader – “从字符inputstream中读取文本,缓冲字符,以便高效读取字符,数组和行。”
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这样的读者。
FileReader类有助于在文件上写入,但是它的效率很低,因为它一次只能从文件中取回一个字符,而BufferedReader取出数据块并将其存储在缓冲区中,所以不需要从文件恢复中一次一个字符地使用缓冲区。
Bufferedreader – 实际上可以用作Scanner方法的替代方法,获取文件,获取input。
FileReader – 顾名思义。