由于篇幅缘由,上一篇直接了字符输入流,今天来分析一下跟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