FilterOutputStream的用法

use*_*443 3 java outputstream stream output

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

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

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

Evg*_*eev 10

有效Java项目中的 Joshua Bloch 项目16:赞成组合而不是继承解释了为什么继承并不总是最好的工具.使用Decorator模式通常更有效.FilterOutputStream和FilterInputStream是实现此模式的基础.例如,我想阻止OutputStream.close.这就是我能做的

class NonCloseableOutputStream extends FilterOutputStream {

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

    @Override
    public void close() throws IOException {
        // ignore
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请至少在Android SDK中小心,因为`FilterOutputStream.write(byte [],int,int)`实现不会调用委托`write(byte [],int,int)`但是为每个调用`的字节做一个循环为每一个写(字节)`.如果你在FileOutputStream上使用它会有一个糟糕的时间(如果没有,你可能会有一个不太好的时间). (3认同)