4

System.out并且System.err都是PrintStreams;并PrintStream扩展FilterOutputStream

FilterOutputStream's javadoc:

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

FilterOutputStream 类本身只是简单地用将所有请求传递到底层输出流的版本覆盖了 OutputStream 的所有方法。FilterOutputStream 的子类可能会进一步覆盖其中一些方法,并提供额外的方法和字段。

(强调我的)

FilterOutputStream本身延伸OutputStream

我在这里不知所措。有什么理由PrintStream需要扩展FilterOutputStream而不是OutputStream

示例代码赞赏...

4

3 回答 3

2

FilterOutputStream应用组合模式,它将所有调用委托给其实例变量out

/* The underlying output stream to be filtered. */
protected OutputStream out;

FilterOutputStream也有抽象类的默认实现OutputStream

public void write(int b) throws IOException {
    out.write(b);
}

public void write(byte b[]) throws IOException {
    write(b, 0, b.length);
}

public void write(byte b[], int off, int len) throws IOException {
    if ((off | len | (b.length - (len + off)) | (off + len)) < 0)
        throw new IndexOutOfBoundsException();

    for (int i = 0 ; i < len ; i++) {
        write(b[off + i]);
    }
}

public void flush() throws IOException {
    out.flush();
}

public void close() throws IOException {
    try {
      flush();
    } catch (IOException ignored) {
    }
    out.close();
}

现在,包括在内的任何类PrintStream都可以扩展FilterOutputStream和覆盖适当的方法。请注意,他们仍然需要将呼叫委托给out. 例如PrintStream#flush()

public void flush() {
    synchronized (this) {
        try {
            ensureOpen();
            out.flush();
        }
        catch (IOException x) {
            trouble = true;
        }
    }
}
于 2013-07-20T19:55:31.267 回答
1

PrintStream 必须实现各种过滤器,处理字符编码,最终将非字符数据打印为字符。

FilterOutputStream 的一般合同最适合这个,所以这是使用的类。

于 2013-07-20T19:43:03.093 回答
0

任何需要过滤嵌套的低级Stream的输入或输出的高级Stream,都需要先扩展FilteredOutputStream,InputStreams也是如此。因此,所有更高级别的 OutputStreams 都扩展 FilteredOutputStream 类是有道理的,换句话说,所有允许并且实际上需要嵌套其他 Streams 才能运行的 Streams 都必须扩展该类。

我不知道这个类在内部做了什么,但我想它会以某种方式按摩数据以允许更高级别的流能够理解它们。要了解更多信息,我猜您将不得不深入研究源代码。

于 2013-07-20T19:35:36.597 回答