5

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

这个类是过滤输出流的所有类的超类。这些流位于已经存在的输出流(底层输出流)之上,它用作其基本的数据接收器,但可能会沿途转换数据或提供附加功能。

对我来说,它似乎有相同的方法OutputStream(也许它出于某种原因覆盖了它们?)。它提供了什么样的数据“转换”,什么时候可以在自己的 Java 应用程序中使用它?

4

4 回答 4

10

Joshua Bloch 在Effective Java 第 16 条:偏好组合胜于继承解释了为什么继承并不总是最适合这项工作的工具。使用装饰器模式通常更有效。FilterOutputStream 和 FilterInputStream 是实现此模式的基础。例如,我想阻止 OutputStream.close。这是我能做的

class NonCloseableOutputStream extends FilterOutputStream {

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

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

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

于 2013-07-10T06:29:57.097 回答
3

FilterOutputStream 类本身只是简单地使用将所有请求传递到底层输出流的版本覆盖了 OutputStream 的所有方法。

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

这些类来自 Java 1.0,因此它们的设计可能不是最好的。但是,扩展 aFilterStream仍然可以正常工作,以防您需要创建自己的(尽管有很多现成的过滤器流(如CheckedInputStreamDigestInputStreamCipherInputStream))。

于 2013-07-10T06:33:18.857 回答
1

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

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

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

于 2013-07-10T06:34:51.843 回答
1

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

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

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

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

于 2013-07-10T06:35:27.320 回答