Удвоение System.out

Я хочу написать System.out сообщения другому OutputStream, но я все еще хочу иметь стандартный вывод тоже.

Я нашел ответ на этот похожий вопрос. Копирование и перенаправление 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) {}
            }
        }
    }
}

Это всего лишь черновик, но хороший ли это подход? Я не знаю, есть ли лучшее решение, поэтому я ищу подтверждение, идеи и предложения.

1 ответ

Решение

Я думаю, что есть библиотека Apache, которая делает это ( TeeOutputStream, спасибо @Thilo), но ваша реализация выглядит хорошо для меня.

Другие вопросы по тегам