4

System.outでありSystem.err、両方ともPrintStreams です。とPrintStream拡張しFilterOutputStreamます。

FilterOutputStreamの javadocから:

このクラスは、出力ストリームをフィルタリングするすべてのクラスのスーパークラスです。これらのストリームは、データの基本的なシンクとして使用する既存の出力ストリーム (基になる出力ストリーム) の上にありますが、途中でデータを変換したり、追加機能を提供したりする可能性があります。

クラス FilterOutputStream 自体は、基になる出力ストリームにすべての要求を渡すバージョンで、OutputStream のすべてのメソッドを単純にオーバーライドします。FilterOutputStream のサブクラスは、これらのメソッドの一部をさらにオーバーライドし、追加のメソッドとフィールドを提供する場合があります。

(私のものを強調)

FilterOutputStreamそれ自体が伸びOutputStreamます。

私はここで途方に暮れています。の代わりにPrintStream拡張する必要がある理由はありますか?FilterOutputStreamOutputStream

サンプルコードを高く評価...

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 に答える
0

ネストされた下位レベルの Stream の入力または出力をフィルター処理する必要がある上位レベルの Stream は、最初に FilteredOutputStream を拡張する必要があり、InputStreams についても同じことが言えます。したがって、上位レベルのすべての OutputStreams が FilteredOutputStream クラスを拡張することは理にかなっています。つまり、機能するために他のストリームのネストを許可し、実際に必要とするすべてのストリームは、このクラスを拡張する必要があります。

クラスが内部で何をしているのかはわかりませんが、何らかの方法でデータをマッサージして、より高いレベルのストリームがそれらを理解できるようにしていると思います。詳細を知るには、ソース コードを詳しく調べる必要があると思います。

于 2013-07-20T19:35:36.597 に答える