Java IO:FilterInputStream 类

FilterInputStream 类位于 java.io 包中,它继承自 InputStream,是一个抽象装饰器类。如下图:

image.png

从上图可以看出,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 类。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号