FilterInputStream 类位于 java.io 包中,它继承自 InputStream,是一个抽象装饰器类。如下图:
从上图可以看出,FilterInputStream 是一个基类,用于实现自己的过滤输入流(如 BufferedInputStream、DataInputStream 等等)。
基本上,它只是覆盖了 InputStream 中的所有方法,并将对 FilterInputStream 上任何方法的所有调用传递到一个封装的 InputStream 上。源码如下:
public class FilterInputStream extends InputStream { protected volatile InputStream in; // 这就是封装的 InputStream protected FilterInputStream(InputStream in) { this.in = in; } @Override public int read() throws IOException { return in.read(); } @Override public int read(byte[] b) throws IOException { return read(b, 0, b.length); } @Override public int read(byte[] b, int off, int len) throws IOException { return in.read(b, off, len); } @Override public long skip(long n) throws IOException { return in.skip(n); } @Override public int available() throws IOException { return in.available(); } @Override public void close() throws IOException { in.close(); } @Override public void mark(int readlimit) { in.mark(readlimit); } @Override public void reset() throws IOException { in.reset(); } @Override public boolean markSupported() { return in.markSupported(); } }
FilterInputStream 中,封装的 InputStream 可以通过构造函数传递给它,就像下面这样:
FilterInputStream inputStream = new FilterInputStream(new FileInputStream("c:\\myfile.txt"));
注意,FilterInputStream 类没有任何特殊行为,它的目的是为你自己的子类提供一个基类。
FilterInputStream 类看上去什么多没有做,那么设计该类的目的是什么呢?
该类的设计目的在于为其他输入流添加额外的功能。借助装饰器模式(装饰器模式是一种结构型设计模式,它允许在不修改现有对象结构的情况下,动态地给对象添加额外的职责或行为),FilterInputStream 可以在不改变原有输入流结构的情况下,对其功能进行扩展。
注意:FilterInputStream 本身并不直接处理数据读取,而是将实际的读取操作委托给被装饰的输入流,同时可以在读取过程中添加一些额外的处理逻辑,例如数据缓冲、加密解密等。例如:
public class FilterInputStream implements InputStream { private InputStream input; // 被装饰的流 //... public FilterInputStream(InputStream input) { this.input = input; } //... @Overrite public int read() { // 这里可以进行增强、加密、缓冲等操作 return input.read(); } }
上述代码中,一个 FilterInputStream 包含了一些其他的输入流(InputStream 的子类),它将这些输入流作为其基本数据源,可在这个过程中转换数据或者提供额外的功能。
FilterInputStream 类本身只是将所有请求传递给所包含的输入流的对应方法,如 read() 方法将传递给所包含输入流的 read() 方法。FilterInputStream 的子类可以进一步覆盖其中的一些方法,并且也可以提供额外的方法和字段。例如:
public class MyFilterInputStream extends FilterInputStream { public FilterInputStream(InputStream input) { super(input); } //... @Overrite public int read() { // 这里取模操作 return super.read() % 2; } }
到这里,应该清楚 FilterInputStream 类的作用了吧,如果你要对 InputStream 类增强,可以直接继承 FilterInputStream 类,而不是继承 InputStream 类。