OutputStreamWriter是字符流与字节流之间的桥梁。
通过它写入的字符流可以通过特殊的字符集转化为字节流。这个特殊的字符集可以指定,也可以采用平台默认的字符集。
每一次调用write()方法都会导致字符转化为字节。最后的结果(转化后的字节)会先缓存到一个buffer中,然后在写入到输出流。
为了效率,可以采用BufferedWriter对象包裹OutputStreamWriter对象的方式来避免频繁的转化操作(字符转化为字节)。
比如,Writer writer = new BufferedWriter(new OutputStreamWriter(System.out));
构造函数有四个,除了第一个是使用默认的字符encoding方式,其它的都是指定encoding方式。
方法有六个,除了getEncoding() 方法是新增的方法,其它的方法都是在抽象类writer中有过定义的。
查看源码
package java.io; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import sun.nio.cs.StreamEncoder; public class OutputStreamWriter extends Writer { private final StreamEncoder se; public OutputStreamWriter(OutputStream out, String charsetName) throws UnsupportedEncodingException { super(out); if (charsetName == null) throw new NullPointerException("charsetName"); se = StreamEncoder.forOutputStreamWriter(out, this, charsetName); } ....... //balabala 一大段 }
发现所有的方法都是调用 StreamEncoder 这个对象的方法。于是我又跑去看StreamEncoder 的源码。
发现里面就是通字符集 将 字符 转换为 字节,然后再调用OutputStream对象向字节流写入字节。
哎呀,又说简单了。其实没那么简单,也没那么难,看看源码就好了。这里面还涉及Java.nio的知识点。