好的,这是一个有趣的问题。似乎不是一种同时解决所有
PrintStream方法的优雅方法。(不幸的是没有
FilterPrintStream。)
我确实写了一个丑陋的基于反射的解决方法(我想不要在生产代码中使用它:)
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; }}…可以像这样使用:
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); }}结果输出:
hello 5Some error----- Log for System.out: -----hello 5----- Log for System.err: -----Some error
(不过请注意,其中的
out字段
FilterOutputStream已受到保护和记录,因此它是API的一部分:-)



