System.out
和System.err
都是PrintStream
个;并PrintStream
延长FilterOutputStream
。
来自FilterOutputStream
的javadoc:
此类是过滤输出流的所有类的超类。这些流位于已存在的输出流(基础输出流)的顶部,它用作数据的基本接收器,但可能会沿途转换数据或提供其他功能。
类FilterOutputStream本身只是覆盖了OutputStream的所有方法,其中的版本将所有请求传递给基础输出流。 FilterOutputStream的子类可以进一步覆盖其中一些方法,并提供其他方法和字段。
(强调我的)
FilterOutputStream
本身延伸OutputStream
。
我在这里不知所措。 PrintStream
需要扩展FilterOutputStream
而不是OutputStream
是否有任何理由?
示例代码赞赏...
答案 0 :(得分: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;
}
}
}
答案 1 :(得分:1)
PrintStream必须实现各种过滤器,处理字符编码,并最终将非字符数据打印为字符。
FilterOutputStream的常规合约最适合,因此这是使用的类。
答案 2 :(得分:0)
需要过滤嵌套的低级Stream的输入或输出的任何更高级别的Stream需要首先扩展FilteredOutputStream,对于InputStreams也是如此。因此,高级OutputStreams的 所有 扩展FilteredOutputStream类是有意义的,换句话说,所有允许实际需要嵌套其他Streams的Streams功能,必须扩展这个类。
我不知道这个类在内部做了什么,但是我想它以某种方式按摩数据以允许更高级别的流能够理解它们。要知道更多,我猜你将不得不深入研究源代码。