0

System.outメッセージを別のに書き込みたいOutputStreamのですが、標準出力も必要です。

この同様の問題Copy and Redirecting System.err Streamに関する回答を見つけました:

つまり、出力を複製できる PrintStream を定義し、次を使用してこれを割り当てる必要があります。

System.setErr(doubleLoggingPrintStream)

これは私がこれまでに作ったものです:

public class DoublerPrintStream extends PrintStream {

    private OutputStream forwarder;

    public DoublerPrintStream(OutputStream target, OutputStream forward) {
        super(target, true);
        this.forwarder = forward;
    }

    @Override
    public void write(byte[] b) throws IOException {
        try {
            synchronized (this) {
                super.write(b);
                forwarder.write(b);
                forwarder.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
        }
    }

    @Override
    public void write(byte[] buf, int off, int len) {
        try {
            synchronized (this) {
                super.write(buf, off, len);
                forwarder.write(buf, off, len);
                forwarder.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
        }
    }

    @Override
    public void write(int b) {
        try {
            synchronized (this) {
                super.write(b);
                forwarder.write(b);
                forwarder.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
        }
    }

    @Override
    public void flush() {
        super.flush();
        try { forwarder.flush(); } catch (IOException e) { }
    }

    @Override
    public void close() {
        super.close();
        if (forwarder != null) {
            try {
                forwarder.close();
            } catch (Exception e) {}
            }
        }
    }
}

これは単なる草案ですが、これは良いアプローチですか? より良い解決策があるかどうかはわかりませんので、確認、アイデア、提案を探しています。

4

1 に答える 1

3

それを行うApacheライブラリがあると思います(TeeOutputStream、@Thiloに感謝します)が、あなたの実装は私には良さそうです。

于 2012-10-29T12:29:39.720 に答える