Java FileWriter OutputStreamWriter类源码解析

FileWriter

由于篇幅缘由,上一篇直接了字符输入流,今天来分析一下跟FileReader相对应的字符输出流FileWriter。FileWriter是将字符写入文件的通用类,构造函数假定使用默认的字符编码和默认的字节缓冲区大小8K是使用者能够接受的,若是要指定这些值,须要经过一个FileOutputStream来构造FileWriter的父类OutputStreamWriterapp

文件是否有效或者是否可以被建立取决于平台,在一些平台上,对于同一个文件同一时间只容许一个FileWriter或者其余文件写入对象打开。在这种状况下,若是一个文件已经被打开,构造函数会抛出异常。函数

和FileReader相似,FileWriter也是除了构造函数之外所有是继承了父类的方法。先建立一个FileOutputStream,若是不给出append参数或者append为false则清空原文件从头开始写入,不然是从尾部开始扩展文件内容,使用文件描述符建立时一定是从文件头部开始写。而后经过FileOutputStream建立OutputStreamWriterthis

public FileWriter(String fileName) throws IOException {
        super(new FileOutputStream(fileName));
    }

    public FileWriter(String fileName, boolean append) throws IOException {
        super(new FileOutputStream(fileName, append));
    }

    public FileWriter(File file) throws IOException {
        super(new FileOutputStream(file));
    }

    public FileWriter(File file, boolean append) throws IOException {
        super(new FileOutputStream(file, append));
    }

    public FileWriter(FileDescriptor fd) {
        super(new FileOutputStream(fd));
    }

OutputStreamWriter

OutputStreamWriter继承了抽象类Writer,跟OutputStreamReader相似,主要重写的方法都是基于StreamEncoder来完成,StreamEncoder在构造函数中经过工厂方法构造。编码

在构造函数中存在super(out),做用是构造父类Writer,将OutputStream做为加锁的对象spa

//指定字符集名字
    public OutputStreamWriter(OutputStream out, String charsetName)
        throws UnsupportedEncodingException
    {
        super(out);
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);//传给StreamEncoder的加锁对象是OutputStreamWriter对象自身
    }
    //使用默认字符集
    public OutputStreamWriter(OutputStream out) {
        super(out);
        try {
            se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
        } catch (UnsupportedEncodingException e) {
            throw new Error(e);
        }
    }
    //使用指定的字符集
    public OutputStreamWriter(OutputStream out, Charset cs) {
        super(out);
        if (cs == null)
            throw new NullPointerException("charset");
        se = StreamEncoder.forOutputStreamWriter(out, this, cs);
    }
    //使用指定的CharsetEncoder
    public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {
        super(out);
        if (enc == null)
            throw new NullPointerException("charset encoder");
        se = StreamEncoder.forOutputStreamWriter(out, this, enc);
    }

OutputStreamWriter重写了Writer中的write, flush, close,此外Writer中的append方法最终也是基于write来完成的,这些方法都是直接调用StreamEncoder中的对应方法。code

相关文章
相关标签/搜索