InputStream和OutputStream用来读写字节流,Reader和Writer用来读写字符流,但是实际上字符流本质也是字节流,它们之间通过一种编码方式来绑定。所以我们经常会碰到这样的操作:将某个InputStream中的字节以字符的形式读取出来,或者将一个字符流写到某个字节流里,这种情况下,我们就需要在字节流和字符流之间搭建一个桥。InputStreamReader和OutputStreamWriter就是这个桥。

OutputStreamWriter

OutputStreamWriter实际上也是一个Writer,它是Writer的子类:

  1. public class OutputStreamWriter extends Writer {}

重要字段

OutputStreamWriter内部有一个StreamEncoder,OutputStreamWriter的write操作,都是通过它来完成的。它实际上也是一个writer:

  1. public class StreamEncoder extends Writer {}

它有一个字段是OutputStream,表示要在哪个字节流上进行操作。
image.png
我们不再过多地描述它的逻辑,来看OutputStreamWriter是怎样来初始化的。

构造方法

  1. public OutputStreamWriter(OutputStream out, String charsetName)
  2. throws UnsupportedEncodingException
  3. {
  4. super(out);
  5. if (charsetName == null)
  6. throw new NullPointerException("charsetName");
  7. se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);
  8. }

第一个参数OutputStream就是要写入的字节流,它实际上是用来构建StreamEncoder的,还有charsetName即编码方式,也是用来构建StreamEncoder的。

write方法

OutputStreamWriter作为Writer的一个子类,本来只需要重写一个多字符的write方法即可,但是OutputStreamWriter重写了多个write方法,这些write方法都是通过内部的StreamEncoder来实现的:

  1. public void write(int c) throws IOException {
  2. se.write(c);
  3. }
  4. public void write(String str, int off, int len) throws IOException {
  5. se.write(str, off, len);
  6. }
  7. public void write(char cbuf[], int off, int len) throws IOException {
  8. se.write(cbuf, off, len);
  9. }

InputStreamReader

InputStreamReader的实现方式与OutputStreamWriter几乎一致,它内部有一个StremDecoder(对应OutputStreamWriter的StreamEncoder),然后它的read方法都是通过StreamDecoder来实现的。这里就不再过多解释了。