OutputStreamWriter API 以及源码解读

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的知识点。

原文地址:https://www.cnblogs.com/cuglkb/p/6906403.html