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

相關文章
相關標籤/搜索