面向字符的输出流
周sir |
2015年4月17日 |
输入输出(IO)操作 |
0 条评论 | 1589
面向字符的输出流都是 Writer 的子类。和输入侧一样,Writer 是抽象类,真正写出文本要用 FileWriter、BufferedWriter 这些子类。
写文件时先构造输出流对象,再 write();带缓冲的写法还要在结束前 flush(),把缓冲区里剩下的字符真正落到文件上。

一、Writer 的类层次
类层次结构如下(原文图 10-5):

主要子类及说明(原文表 10-3):

Writer 提供的方法(原文表 10-4):

| 类 |
角色 |
关键点 |
FileWriter |
节点流 |
按文件名创建可写流;第二参数为 true 时追加 |
BufferedWriter |
处理流 |
写入缓冲区,结束前要 flush() |
newLine() |
换行 |
write() 不会自动写回车,跨平台换行靠它 |
二、用 FileWriter 写入文件
FileWriter 是 OutputStreamWriter 的子类,因此也能使用 Writer 与 OutputStreamWriter 的方法。构造后再调用 write():
public FileWriter(String name); // 根据文件名创建可写输出流
public FileWriter(String name, boolean a); // a 为 true 时追加到文件末尾
【例 10-3】把 ASCII 可见字符写入文件:
import java.io.*;
class ep10_3 {
public static void main(String args[]) {
try {
FileWriter a = new FileWriter("ep10_3.txt");
for (int i = 32; i < 126; i++) {
a.write(i);
}
a.close();
} catch (IOException e) {}
}
}
运行后打开 ep10_3.txt,内容为:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
三、用 BufferedWriter 复制文件
先建 FileWriter,再交给 BufferedWriter,最后用 flush() 清空缓冲区:
public BufferedWriter(Writer out);
public BufferedWriter(Writer out, int size);
【例 10-4】用 BufferedWriter 做文件复制:
import java.io.*;
class ep10_4 {
public static void main(String args[]) {
String str = new String();
try {
BufferedReader in = new BufferedReader(new FileReader("ep10_4_a.txt"));
BufferedWriter out = new BufferedWriter(new FileWriter("ep10_4_b.txt"));
while ((str = in.readLine()) != null) {
System.out.println(str);
out.write(str); // 写入这一行
out.newLine(); // 补上换行
}
out.flush();
in.close();
out.close();
} catch (IOException e) {
System.out.println("出现错误" + e);
}
}
}
注意:write() 写入一行时不会带上回车,必须再调 newLine(),目标文件才能和源文件行结构一致。
一句话总结:写文本用 FileWriter;要缓冲、要按行复制,就包 BufferedWriter,记得 newLine() 和 flush()。
转载请注明来源:面向字符的输出流
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。