2009-11-11 55 views
2

为什么使用过滤器流和在哪里?我读过滤流将用于让所需的信息进入流..是否正确,如果是的话,我们如何从流中过滤,以及它将在哪里使用?什么是真正的过滤器流?

java.io.Filter ....

我在这里的问题是,它很难理解为什么我们使用的过滤器流,因为我们可以用其他流做大部分的东西,对吧。

+3

这是什么,“过滤器”,你会说什么? 'javax.servlet.Filter'?请指出您正在讨论的API,并且请告知更多关于您的问题/问题的上下文。这太模糊了。 – BalusC 2009-11-11 12:51:34

回答

9

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

如果我们谈论FilterInputStream类,它仅仅是一个无用的InputStream的包装。对Filter的方法的每次调用都将简单地调用封装的InputStream上的对应方法。一个人,它是无用的。

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

// 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); 
+0

能否请您详细说明..谢谢 – i2ijeya 2009-11-11 13:07:22

+0

谢谢...了解如何过滤完成..那么子类是做什么的。即,它有四个派生类,这些类是FilterInputStream的子类的目的是什么? – i2ijeya 2009-11-11 13:20:12

+0

由于FilterInputStream没有任何0参数构造函数,我们怎么能扩展它与另一个类? – i2ijeya 2009-11-11 14:49:55

3

需要这些过滤器*类可以扩展类在运行时不知道底层类型。这种模式被称为装饰或包装,

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

采取的BufferedInputStream为例。没有包装,你需要为每个InputStream使用多个版本。例如,

BufferedInputStream extends InputStream ... 
    BufferedFileInputStream extends FileInputStream ... 
    BufferedByteArrayInputStream extends ByteArrayInputStream ... 
与包装物

现在,所有你需要的是

BufferedInputStream extends FilterInputStream ...