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