Если вы хотите видеть то, что вы уже записали на консоль, вам нужно написать собственную реализацию PrintStream
, которая просто оборачивает существующую PrintStream
, сохраняет все, что она должна написать, а затем делегирует ( все методы) в завернутый (оригинал) PrintStream
для выполнения фактической работы. То, как вы храните сообщения, полностью зависит от ваших потребностей (храните только последнюю записанную строку, сохраняйте карту метки времени -> строку или что-то еще). Получив это, вы можете заменить System.out
своей собственной реализацией (через System.setOut()
):
public class RememberAllWrittenTextPrintStream extends PrintStream {
private static final String newLine = System.getProperty("line.separator");
private final StringBuffer sb = new StringBuffer();
private final PrintStream original;
public RememberAllWrittenTextPrintStream(PrintStream original) {
this.original = original;
}
public void print(double d) {
sb.append(d);
original.print(d);
}
public void print(String s) {
sb.append(s);
original.print(s);
}
public void println(String s) {
sb.append(s).append(newLine);
original.println(s);
}
public void println() {
sb.append(newLine);
original.println();
}
public void printf(String s, Object... args) {
sb.append( String.format(s, args) );
original.printf(s, args);
}
// .....
// the same for ALL the public methods in PrintStream....
// (your IDE should help you easily create delegates for the `original` methods.)
public String getAllWrittenText() {
return sb.toString();
}
}
Вам также может понадобиться позаботиться о безопасности потоков (StringBuffer является потокобезопасным, но вам может потребоваться больше, чем это).
После того, как у вас есть выше, вы можете:
RememberAllWrittenTextPrintStream ps
= new RememberAllWrittenTextPrintStream(System.out);
System.setOut(ps);
System.out.print("bla");
System.out.print("bla");
ps.getAllWrittenText(); // should now return "blabla"
EDIT: добавлены println()
реализации, использующие независимую от платформы newLine
.