15.6.4 读取带缓存的BufferedReader字符流

通过上面的叙述知道,“Reader”类本身不可能创建对象,因为它是抽象类,那么可以通过子类覆盖这个抽象类中的抽象方法,这称为非抽象类。非抽象类就可以创建对象。这个抽象类可以形成两个类:“InputStreamReader”和“BufferedReader”两个类。

【实例15.13】“InputStreamReader”类比较简单,通过一个实例来掌握该如何使用它。实例代码如下。


01 import java.io.*;

02 ///创建一个文件类对象f

03 ///创建一个输入流对象fis,并且以f作为参数

04 ///创建一个字符输入流对象isr,并且以fis作为参数

05 ///将读出的数据放入字符st中

06 ///再将字符输出

07 public class file12

08 {

09 public static void main(String[]args)throws Exception

10 {

11 File f=new File("d:\filetest\2.txt");

12 FileInputStream fis=new FileInputStream(f);

13 InputStreamReader isr=new InputStreamReader(fis);

14 char st=(char)isr.read();

15 System.out.println(st);

16 }

17 }


【代码说明】第14行将文本中的字符读取出来,但它一次只能读一个字符。

【运行效果】这是读取2.txt中的内容,读者可在此文本中输入几个字符进行测试。

“BufferedReader”类是继承“Reader”类的子类,其在内部有缓冲机制,所以可以以行为单位进行输入工作。它的工作原理如图15.6所示。

15.6.4 读取带缓存的BufferedReader字符流 - 图1

图 15.6 BufferedReader类模拟图

从图15.6可以看出,先从文件中以字节形式读取数据,然后将数据组合成字符型数据,最后将所有读取的数据缓存起来一起输出。这个类的常用方法如下:


public String readLine();


【实例15.14】下面举一个有关BufferedReader类的实例。


01 import java.io.*;

02 ///创建一个文件类对象f

03 ///创建一个输入流对象fis,并且以f作为参数

04 ///创建一个字符输入流对象isr,并且以fis作为参数

05 ///创建一个带缓冲的输入流对象,利用此对象读取一行数据

06 public class file13

07 {

08 public static void main(String[]args)throws Exception

09 {

10 File f=new File("d:\filetest","2.txt");

11 FileInputStream fis=new FileInputStream(f);

12 InputStreamReader isr=new InputStreamReader(fis);

13 BufferedReader br=new BufferedReader(isr);

14 System.out.println(br.readLine());

15 System.out.println(br.readLine());

16 }

17 }


【代码说明】第14~15行表示读取2.txt的前两行数据,readLine()方法每次读取一行数据。2.txt中的数据读者可自己添加几行。

【运行效果】


one line

two line


上述代码可以读取大量的数据,比前面的类读取数据要容易得多。