FilterOutputStream的用法

时间:2013-07-10 06:17:41

标签: java stream output outputstream

Java中FilterOutputStream的实际用法是什么? 来自javadocs:

  

此类是过滤输出流的所有类的超类。这些流位于已存在的输出流(基础输出流)的顶部,它用作数据的基本接收器,但可能会沿途转换数据或提供其他功能。

对我而言,它似乎与OutputStream具有相同的方法(可能由于某种原因覆盖了它们?)。什么样的数据"转换"它提供什么,什么时候可以在自己的Java应用程序中使用它?

4 个答案:

答案 0 :(得分:10)

Effective Java Item 16中的Joshua Bloch:赞成继承继承解释了为什么继承并不总是最适合工作的工具。使用Decorator通常更有效率图案。 FilterOutputStream和FilterInputStream是实现此模式的基础。例如,我想阻止OutputStream.close。这就是我能做的事情

class NonCloseableOutputStream extends FilterOutputStream {

    public NonCloseableOutputStream(OutputStream out) {
        super(out);
    }

    @Override
    public void close() throws IOException {
        // ignore
    }
}

现在我的类可以接受OutputStream的任何子类并使其不可关闭。

答案 1 :(得分:3)

  

类FilterOutputStream本身只是覆盖了OutputStream的所有方法,其中的版本将所有请求传递给基础输出流。

正如您所怀疑的那样,除了使用更有用的实现覆盖方法之外,它没有做太多。

这些类来自Java 1.0,因此可能无法以最佳方式进行设计。但是,如果您需要创建自己的过滤器流(FilterStreamCheckedInputStream或{{1}很多事情)。

答案 2 :(得分:1)

CheckedInputStream看起来对我有用。它根据通过它传递的数据计算校验和。我可以看到自己使用它。

另一个例子是DeflateOutputStream,它自动处理正确压缩格式的数据。

我想你完全理解它的用途。子类只是在将数据转发到底层流之前操作数据。

答案 3 :(得分:1)

它与OutputStream具有相同的方法,因为它扩展了OutputStream。事实上,这是一个非常有用的功能:您可以在预期FilterOutputStream的任何地方提供OutputStream

默认情况下,FilterOutputStream不会为您提供任何附加功能。正如其Javadoc所述:

  

FilterOutputStream的子类可能会进一步覆盖其中一些方法

例如,您可以扩展FilterOutputStream并覆盖write(int b)方法,使其写入您提供给它的任何字节,1310除外。这样,您将拥有一个从不包含换行符的输出流。它可能没有任何用处,但它只是一个例子。