InputStream和OutputStream用来读写字节流,Reader和Writer用来读写字符流,但是实际上字符流本质也是字节流,它们之间通过一种编码方式来绑定。所以我们经常会碰到这样的操作:将某个InputStream中的字节以字符的形式读取出来,或者将一个字符流写到某个字节流里,这种情况下,我们就需要在字节流和字符流之间搭建一个桥。InputStreamReader和OutputStreamWriter就是这个桥。
OutputStreamWriter
OutputStreamWriter实际上也是一个Writer,它是Writer的子类:
public class OutputStreamWriter extends Writer {}
重要字段
OutputStreamWriter内部有一个StreamEncoder,OutputStreamWriter的write操作,都是通过它来完成的。它实际上也是一个writer:
public class StreamEncoder extends Writer {}
它有一个字段是OutputStream,表示要在哪个字节流上进行操作。
我们不再过多地描述它的逻辑,来看OutputStreamWriter是怎样来初始化的。
构造方法
public OutputStreamWriter(OutputStream out, String charsetName)
throws UnsupportedEncodingException
{
super(out);
if (charsetName == null)
throw new NullPointerException("charsetName");
se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);
}
第一个参数OutputStream就是要写入的字节流,它实际上是用来构建StreamEncoder的,还有charsetName即编码方式,也是用来构建StreamEncoder的。
write方法
OutputStreamWriter作为Writer的一个子类,本来只需要重写一个多字符的write方法即可,但是OutputStreamWriter重写了多个write方法,这些write方法都是通过内部的StreamEncoder来实现的:
public void write(int c) throws IOException {
se.write(c);
}
public void write(String str, int off, int len) throws IOException {
se.write(str, off, len);
}
public void write(char cbuf[], int off, int len) throws IOException {
se.write(cbuf, off, len);
}
InputStreamReader
InputStreamReader的实现方式与OutputStreamWriter几乎一致,它内部有一个StremDecoder(对应OutputStreamWriter的StreamEncoder),然后它的read方法都是通过StreamDecoder来实现的。这里就不再过多解释了。