Вы можете поймать все, что печатается через 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