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.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