由於篇幅緣由,上一篇直接了字符輸入流,今天來分析一下跟FileReader相對應的字符輸出流FileWriter。FileWriter是將字符寫入文件的通用類,構造函數假定使用默認的字符編碼和默認的字節緩衝區大小8K是使用者能夠接受的,若是要指定這些值,須要經過一個FileOutputStream來構造FileWriter的父類OutputStreamWriter。app
文件是否有效或者是否可以被建立取決於平臺,在一些平臺上,對於同一個文件同一時間只容許一個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繼承了抽象類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