15.6.5 带缓存的字符输出流BufferedWriter类

“Writer”类本身不能创建对象,因为它是抽象类,那么可通过子类来覆盖这个抽象类中的抽象方法,然后就可以创建对象。由这个抽象类可以形成两个类:“OutputStreamWriter”和“BufferedWriter”两个类。

【实例15.15】下面通过一个实例,学习“OutputStreamWriter”类的使用方法。


01 import java.io.*;

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

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

04 ///创建一个字符输出流对象osw,并且以fos作为参数

05 ///利用osw对象写数据

06 public class file14

07 {

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

09 {

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

11 FileOutputStream fos=new FileOutputStream(f);

12 OutputStreamWriter osw=new OutputStreamWriter(fos);

13 osw.write('美');

14 osw.close();

15 }

16 }


【代码说明】第10行创建一个文件类对象f,指向2.txt文件,第13行在此文件内输入一个字。

【运行效果】在2.txt内输入了一个字“美”。

这个程序段将数据写到文本中。

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

15.6.5 带缓存的字符输出流BufferedWriter类 - 图1

图 15.7 BufferWriter类模拟图

从图15.7可以看出,先是以字符的形式将数据缓存起来,然后将其变成字节的形式写入文件。这个类的常用方法如下所示:

public void write(String str):将字符串写入输出流中。

public void flush():将缓冲区内的数据强制写入输出流。

public void newLine():向输出流中写入一个行结束标记。

BufferedWriter的原理同“BufferedReader”类一样,只不过顺序反过来了。

【实例15.16】下面来看一个有关“BufferedWriter”类的实例。


01 import java.io.*;

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

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

04 ///创建一个字符输出流对象osw,并且以fos作为参数

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

06 public class file15

07 {

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

09 {

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

11 FileOutputStream fos=new FileOutputStream(f);

12 OutputStreamWriter osw=new OutputStreamWriter(fos);

13 BufferedWriter bw=new BufferedWriter(osw);

14 bw.write("小王是一个好学生。");

15 bw.newLine();

16 bw.write("他也是一个好学生。");

17 bw.newLine();

18 bw.write("小明也是一个好学生。");

19 bw.close();

20 }

21 }


【代码说明】第10行创建文件类对象f,指向2.txt文件。第14~18行在文件中输入三行文字。第19行关闭输出流。

【运行效果】这样就可以一个字符串一个字符串地输入数据了。结果是在2.txt中输入了三行文字。

【实例15.17】为了能让读者复习已经学过的流的知识,下面将举一个有关流的综合实例。


01 import java.io.*;

02 ///在read1方法中,以带缓冲的输入流对象为参数,它主要是让这个输入流对象读取数据

03 ///在write1方法中,以带缓冲的输出流对象为参数,它主要是让这个输出流对象写入数据到f

04 ///对象中

05 public class file16

06 {

07 public void read1(BufferedReader br)

08 {

09 try

10 {

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

12 }

13 catch(Exception e)

14 {}

15 }

16 public void write1(String str, BufferedWriter bw)

17 {

18 if(str.length()>5)

19 {

20 try

21 {

22 bw.write(str);

23 bw.newLine();

24 bw.flush();

25 }

26 catch(Exception e){}

27 }

28 else if((str.length())<5)

29 {

30 try

31 {

32 bw.write("输入有误!");

33 bw.newLine();

34 bw.flush();

35 }

36 catch(Exception e){}

37 }

38 }

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

40 ///创建一个文件输出流对象fos

41 ///创建一个文件输入流对象fis

42 ///创建一个多字节的输出流对象osw

43 ///创建一个多字节输入流对象isr

44 ///创建一个带缓冲的输入流对象br

45 ///创建一个代缓冲的输出流对象bw

46 ///让bw将数据写入到f中

47 ///让br从f中将数据读出来

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

49 {

50 file16 f2=new file16();

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

52 FileOutputStream fos=new FileOutputStream(f);

53 FileInputStream fis=new FileInputStream(f);

54 OutputStreamWriter osw=new OutputStreamWriter(fos);

55 InputStreamReader isr=new InputStreamReader(fis);

56 BufferedWriter bw=new BufferedWriter(osw);

57 BufferedReader br=new BufferedReader(isr);

58 f2.write1("祖国是个大花园",bw);

59 f2.write1("小明说是吗",bw);

60 f2.write1("小张觉得小明说的没有错",bw);

61 f2.write1("谢谢了",bw);

62 f2.read1(br);

63 f2.read1(br);

64 f2.read1(br);

65 f2.read1(br);

66 br.close();

67 bw.close();

68 }

69 }


【代码说明】上面的程序段先用输出流将内容输入到文本中,然后再使用输入流读出文本。在读文本时,根据字数判断,如果字数超过5个字的就输出,否则就输出“输入有误!”,这里的判断条件只有大于5和小于5,而第59行输入的正好是5,代码中没有处理。所以其实只是在2.txt中输入了3行数据,所以输出的时候第4行读取的是null。

【运行效果】


祖国是个大花园

小张觉得小明说的没有错

输入有误!

null