Удвоение 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), но ваша реализация выглядит хорошо для меня.