Вы можете поймать все, что печатается через 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 и System.setIn работает аналогично.)
Если вы хотите поймать то, что «подпрограмма» печатает через System.out.println, у вас проблемы, потому что System.out является статическим, поэтому, если вы запустите несколько «подпрограмм», вы получите беспорядок (поскольку вы не можете передать отдельный System класса для каждой подпрограммы).
В такой ситуации я искренне считаю, что было бы лучше запустить отдельный процесс через ProcessBuilder. Стандартные входные/выходные потоки результирующего процесса можно было легко логировать.
(p.s. Когда я думаю об этом, вы, вероятно, могли бы проверить текущую группу потоков в реализации println и исходя из этого решить, какая подпрограмма фактически вызвала метод println)
person
aioobe
schedule
29.10.2010