面向字符的输出流

    |     2015年4月17日   |   输入输出(IO)操作   |     0 条评论   |    1589

面向字符的输出流都是 Writer 的子类。和输入侧一样,Writer 是抽象类,真正写出文本要用 FileWriter、BufferedWriter 这些子类。

写文件时先构造输出流对象,再 write();带缓冲的写法还要在结束前 flush(),把缓冲区里剩下的字符真正落到文件上。

一、Writer 的类层次

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

═╝╧ё (4)

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

═╝╧ё (5)

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

═╝╧ё (6)

类 角色 关键点
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()。

转载请注明来源:面向字符的输出流
本文链接地址:https://ai.zhousir.top/?p=246
回复 取消