为什么使用过滤器流以及在哪里?我读过,过滤器流将用于将所需信息放入流中。这是正确的,如果是这样,我们如何从流中过滤以及它将在何处使用?
... java.io.Filter
我的问题是很难理解为什么我们使用Filter流,因为我们可以使用其他流来完成大部分工作,对吧。
答案 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 ...