Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Ok, this was a fun problem. Dosen't seem to be an elegant way of solving it for all <code>PrintStream</code> methods at once. (Unfortunately there is no <code>FilterPrintStream</code>.)</p> <p>I did write up an ugly reflection-based workaround though (not to be used in production code I suppose :)</p> <pre><code>class LoggedPrintStream extends PrintStream { final StringBuilder buf; final PrintStream underlying; LoggedPrintStream(StringBuilder sb, OutputStream os, PrintStream ul) { super(os); this.buf = sb; this.underlying = ul; } public static LoggedPrintStream create(PrintStream toLog) { try { final StringBuilder sb = new StringBuilder(); Field f = FilterOutputStream.class.getDeclaredField("out"); f.setAccessible(true); OutputStream psout = (OutputStream) f.get(toLog); return new LoggedPrintStream(sb, new FilterOutputStream(psout) { public void write(int b) throws IOException { super.write(b); sb.append((char) b); } }, toLog); } catch (NoSuchFieldException shouldNotHappen) { } catch (IllegalArgumentException shouldNotHappen) { } catch (IllegalAccessException shouldNotHappen) { } return null; } } </code></pre> <p>...that can be used like this:</p> <pre><code>public class Test { public static void main(String[] args) { // Create logged PrintStreams LoggedPrintStream lpsOut = LoggedPrintStream.create(System.out); LoggedPrintStream lpsErr = LoggedPrintStream.create(System.err); // Set them to stdout / stderr System.setOut(lpsOut); System.setErr(lpsErr); // Print some stuff System.out.print("hello "); System.out.println(5); System.out.flush(); System.err.println("Some error"); System.err.flush(); // Restore System.out / System.err System.setOut(lpsOut.underlying); System.setErr(lpsErr.underlying); // Print the logged output System.out.println("----- Log for System.out: -----\n" + lpsOut.buf); System.out.println("----- Log for System.err: -----\n" + lpsErr.buf); } } </code></pre> <p>Resulting output:</p> <pre><code>hello 5 Some error ----- Log for System.out: ----- hello 5 ----- Log for System.err: ----- Some error </code></pre> <p>(Note though, that the <code>out</code> field in <code>FilterOutputStream</code> is protected and documented, so it is part of the API :-)</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload