FilterInputStream主要作用是为其他基础流提供一些额外的功能,这里使用了装饰器模式,从其源码中可以看出,下面是部分源码:
public
class FilterInputStream extends InputStream {
protected volatile InputStream in;
protected FilterInputStream(InputStream in) {
this.in = in;
}
public int read() throws IOException {
return in.read();
}
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
public int read(byte b[], int off, int len) throws IOException {
return in.read(b, off, len);
}
}
从源码中可以看出来,构造函数传入一个InputStream作为对象的成员变量,read的方法调用的都是这个成员变量的read方法,这就是装饰器模式,区别于继承,子类不用再重写父类的方法。而ByteArrayOutputStream使用的是继承,read方法是重写的父类的方法。
FilterInputStream类没事额外的功能,其子类DataInputStream、BufferedInputStream、PushBackInputStream提供了额外的功能。
同理,FilterOutputStream实现逻辑和FilterInputStream基本相同。