使用setOut
不會阻止您使用控制檯,如果先保存它,並且除非使用字節代碼檢測,否則它是唯一的選項。
static final PrintStream OUT = System.out;
static {
// capture all System.out
System.setOut(new MyPrintStream());
OUT.println("Print as normal");
}
class MyPrintStream extends PrintStream {
final ThreadLocal<StringBuilder> text = ThreadLocal.withInitial(() _> new StringBuilder());
public void print(String s) {
StringBuilder sb = text.get();
sb.append(s);
}
public void println(String s) {
StringBuilder sb = text.get();
sb.append(s).append('\n');
// do something with sb.
}
唉,這是相當整潔的解決方案,我沒有想到我的問題。謝謝:) –
@miroslavlalev可以投票給我回答如果你喜歡。 –
@miroslavlalev我已經添加了如何使用ThreadLocal來收集每個線程的輸出。 –