真正的过滤流做什么?

时间:2009-11-11 12:48:33

标签: java filter stream

为什么使用过滤器流以及在哪里?我读过,过滤器流将用于将所需信息放入流中。这是正确的,如果是这样,我们如何从流中过滤以及它将在何处使用?

... java.io.Filter

我的问题是很难理解为什么我们使用Filter流,因为我们可以使用其他流来完成大部分工作,对吧。

2 个答案:

答案 0 :(得分:9)

我想你在谈论java.io.Filter *(比如FilterInputStream)。

如果我们谈论FilterInputStream类,它只是一个不执行任何操作的InputStream的包装器。每次调用Filter的方法都会简单地调用包装的InputStream上的相应方法。一个人,这是没用的。

想象一下,你想要一个将每个“a”字符转换为“b”的InputStream。您可以扩展FilterInputStream并覆盖read()方法:

// this code has not been tested
class ABFilter extends FilterInputStream {
    public ABFilter (InputStream in) {
        super(in);
    }
    @Override
    public int read() {
        int character = super.read();
        if (character == 97)
            return 98;
        return character;
    }
    // similarly implement all other "read()" methods
}

现在您可以使用此流来包装任何现有的流:

InputStream streamWithA = ...;
InputStream streamWithoutA = new ABFilter(streamWithA);

答案 1 :(得分:3)

这些Filter *类需要能够在运行时扩展类而不需要知道底层类型。这种模式称为Decorator或Wrapper,

http://en.wikipedia.org/wiki/Decorator_pattern

以BufferedInputStream为例。如果没有包装器,每个InputStream都需要多个版本。例如,

  BufferedInputStream extends InputStream ...
  BufferedFileInputStream extends FileInputStream ...
  BufferedByteArrayInputStream extends ByteArrayInputStream ...

现在使用包装器,您只需要

  BufferedInputStream extends FilterInputStream ...