次のようにSystem.out
使用して、印刷されたすべてのものをキャッチできます。System.setOut
import java.io.*;
class SystemOutLogging {
public static void main(String[] args) throws IOException,
ClassNotFoundException {
final PrintStream original = System.out;
System.setOut(new PrintStream("programlog.txt") {
public void println(String str) {
process(str + "\n");
}
public void print(String str) {
process(str);
}
private void process(String str) {
// Fill some JEditorPane
original.println("Program printed: \"" + str + "\"");
}
});
System.out.print("Hello ");
System.out.println(" World");
}
}
版画:
Program printed: "Hello "
Program printed: " World
"
(同様に動作するSystem.setErr
andがあります。)System.setIn
「サブプログラム」が印刷するものをキャッチしたい場合は、静的System.out.println
であるため、問題が発生しているため、複数の「サブプログラム」を起動すると、混乱してしまいます(別のクラスをSystem.out
渡すことができないため)System
各サブプログラム)。
このような状況では、ProcessBuilder を介して別のプロセスを起動する方がよいと正直に思います。結果のプロセスの標準入力/出力ストリームは、簡単にログに記録できます。
(ps 考えてみると、おそらくprintln
実装内の現在のスレッド グループを確認し、そこから実際にprintln
メソッドを呼び出したサブプログラムを決定できます)