FilterInputStream和FilterOutputStream属于过滤器流。它们内部有一个对应的InputStream和OutputStream,对FilterInputStream和FilterOutputStream的请求会映射到它们内部的InputStream和OutputStream上。

FilterOutputStream

定义

  1. public class FilterOutputStream extends OutputStream

FilterOutputStream是OutputStream的子类,所以它会有OutputStream的每个方法,例如write等。

内部的OutputStream

image.png
FilterOutputStream内部有一个OutputStream,这个OutputStream就是被过滤的流,在FilterOutputStream这个类的实现中,任何对它的方法例如write都是映射到这个内部的OutputStream上的。

构造方法

  1. public FilterOutputStream(OutputStream out) {
  2. this.out = out;
  3. }

构造方式中会初始化内部的OutputStream。也就是我们创建FilterOutputStream时,必须给定要被过滤的OutputStream。

所有方法会映射到内部的OutputStream

因为FilterOutputStream也是一个OutputStream,所以会有write等方法,它的write以及其他的操作都是映射到内部的OutputStream上的。也就是说,FilterOutputStream只对请求做了一个转发,直接映射到内部的OutputStream上。

  1. public void write(int b) throws IOException {
  2. out.write(b);
  3. }

flush方法也是直接调用内部OutputStream的flush方法:

  1. public void flush() throws IOException {
  2. out.flush();
  3. }

FilterInputStream

定义

  1. public
  2. class FilterInputStream extends InputStream

FilterInputStream继承了InputStream,也就是说,它实际上也是一个InputStream,与FilterOutputStream。

内部的InputStream

  1. /**
  2. * The input stream to be filtered.
  3. */
  4. protected volatile InputStream in;

FilterInputStream内部有一个InputStream,这个InputStream就是被过滤的流,在FilterInputStream这个类的实现中,任何对它的方法例如read都是映射到这个内部的IntputStream上的。

构造方法

  1. protected FilterInputStream(InputStream in) {
  2. this.in = in;
  3. }

构造方式中会初始化内部的InputStream。也就是我们创建FilterInputStream时,必须给定要被过滤的InputStream。

所有方法会映射到内部的InputStream上

因为FilterInputStream也是一个InputStream,所以会有read等方法,它的read以及其他的操作都是映射到内部的InputStream上的。也就是说,FilterInputStream只对请求做了一个转发,直接映射到内部的InputStream上。

  1. public int read() throws IOException {
  2. return in.read();
  3. }

从现在来看,FilterInputStream和FilterOutputStream这两个类只是单纯地做了一下映射,将请求由内部的InputStream或者OutputStream来完成,那么我们可以用它们来实现什么呢?下一篇文章,我们会学到它们的子类:BufferedInputStream和BufferedOutputStream,它们就通过这种映射实现了缓存输入输出数据的作用。