【问题标题】:What really Filter stream do?过滤器流的真正作用是什么?
【发布时间】:2009-11-11 12:48:32
【问题描述】:

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

java.io.Filter....

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

【问题讨论】:

  • 你说的“过滤器”是什么? javax.servlet.Filter?请指出您正在谈论的 API,并请详细说明您的问题/问题的背景。这太模棱两可了。

标签: java filter stream


【解决方案1】:

我想你说的是 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);

【讨论】:

  • 谢谢......了解过滤是如何完成的......那么子类做了什么。即,它有四个派生类,这些类作为FilterInputStream的子类的目的是什么??
  • 既然FilterInputStream没有任何0参数的构造函数,我们怎么能用另一个类来扩展它???
【解决方案2】:

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

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

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

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

现在有了包装器,你所需要的就是

  BufferedInputStream extends FilterInputStream ...

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 2014-04-26
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多