跟我学IO(FilterInputStream类)

FilterInputStream类包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。该类本身只是简单地重写那些将所有请求传递给所包含输入流的InputStream 的所有方法。FilterInputStream的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。

FilterInputStream类包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。该类本身只是简单地重写那些将所有请求传递给所包含输入流的InputStream 的所有方法。FilterInputStream的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。

下面我们直接看看FilterInputStream的源码,就明白该类的实现原理。源码如下:

// 实现了InputStream
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);
    }

    public long skip(long n) throws IOException {
        return in.skip(n);
    }

    public int available() throws IOException {
        return in.available();
    }

    public void close() throws IOException {
        in.close();
    }

    public synchronized void mark(int readlimit) {
        in.mark(readlimit);
    }

    public synchronized void reset() throws IOException {
        in.reset();
    }

    public boolean markSupported() {
        return in.markSupported();
    }
}

从上面可以看出所有提供的方法,如:reset、mark、close、available等方法的实现其实就是调用了FilterInputStream内部InputStream实例的相应方法。这样就可以在原有方法的基础上面提供更强大的功能。如缓存等等。

同时,从代码结构可以看出,这里使用了java设计模式中的装饰模式。装饰(Decorator)模式又名为包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

InputStream装饰模式结构图

1、InputStream扮演抽象角色,抽象了所有输入流的操作。

2、FileInputStream实现了InputStream接口,提供了最基本的操作。

3、FilterInputStream实现了InputStream接口,且内部拥有一个FileInputStream类的实例,其中提供了与FileInputStream类一样的接口,每个接口都是使用FileInputStream实例的对应方法进行处理。

4、BufferedInputStream继承了FilterInputStream类,然后对其中需要加强的内进行重写。如:read方法

关于java设计模式相关的信息,请查看模式栏目。

我们常常听人说,人们因工作过度而垮下来,但是实际上十有八九是因为饱受担忧或焦虑的折磨。 —— 卢伯克.J.
0 不喜欢
说说我的看法 -
全部评论(
没有评论
目录
热门标签
热门文章
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号