FilterInputStream和FilterOutputStream属于过滤器流。它们内部有一个对应的InputStream和OutputStream,对FilterInputStream和FilterOutputStream的请求会映射到它们内部的InputStream和OutputStream上。
FilterOutputStream
定义
public class FilterOutputStream extends OutputStream
FilterOutputStream是OutputStream的子类,所以它会有OutputStream的每个方法,例如write等。
内部的OutputStream
FilterOutputStream内部有一个OutputStream,这个OutputStream就是被过滤的流,在FilterOutputStream这个类的实现中,任何对它的方法例如write都是映射到这个内部的OutputStream上的。
构造方法
public FilterOutputStream(OutputStream out) {
this.out = out;
}
构造方式中会初始化内部的OutputStream。也就是我们创建FilterOutputStream时,必须给定要被过滤的OutputStream。
所有方法会映射到内部的OutputStream
因为FilterOutputStream也是一个OutputStream,所以会有write等方法,它的write以及其他的操作都是映射到内部的OutputStream上的。也就是说,FilterOutputStream只对请求做了一个转发,直接映射到内部的OutputStream上。
public void write(int b) throws IOException {
out.write(b);
}
flush方法也是直接调用内部OutputStream的flush方法:
public void flush() throws IOException {
out.flush();
}
FilterInputStream
定义
public
class FilterInputStream extends InputStream
FilterInputStream继承了InputStream,也就是说,它实际上也是一个InputStream,与FilterOutputStream。
内部的InputStream
/**
* The input stream to be filtered.
*/
protected volatile InputStream in;
FilterInputStream内部有一个InputStream,这个InputStream就是被过滤的流,在FilterInputStream这个类的实现中,任何对它的方法例如read都是映射到这个内部的IntputStream上的。
构造方法
protected FilterInputStream(InputStream in) {
this.in = in;
}
构造方式中会初始化内部的InputStream。也就是我们创建FilterInputStream时,必须给定要被过滤的InputStream。
所有方法会映射到内部的InputStream上
因为FilterInputStream也是一个InputStream,所以会有read等方法,它的read以及其他的操作都是映射到内部的InputStream上的。也就是说,FilterInputStream只对请求做了一个转发,直接映射到内部的InputStream上。
public int read() throws IOException {
return in.read();
}
从现在来看,FilterInputStream和FilterOutputStream这两个类只是单纯地做了一下映射,将请求由内部的InputStream或者OutputStream来完成,那么我们可以用它们来实现什么呢?下一篇文章,我们会学到它们的子类:BufferedInputStream和BufferedOutputStream,它们就通过这种映射实现了缓存输入输出数据的作用。