我正在编写java程序,它创建由某人给出的Runnable对象的不同实例,然后运行它们。例如,user给我一个带有runnable类的.class文件,我创建该对象的实例并运行它。一切正常,直到我决定监控每个不同线程的进度。让我们说当前的Runnable对象在控制台中打印从1到9的所有数字。我想捕获该输出并将其作为String返回。使用System.setOut(..)
阻止我使用控制台,因此它不是一个选项。
答案 0 :(得分:3)
使用setOut
并不会阻止您使用控制台,如果您先保存它,除非您使用字节码检测,否则它是您唯一的选择。
static final PrintStream OUT = System.out;
static {
// capture all System.out
System.setOut(new MyPrintStream());
OUT.println("Print as normal");
}
class MyPrintStream extends PrintStream {
final ThreadLocal<StringBuilder> text = ThreadLocal.withInitial(() _> new StringBuilder());
public void print(String s) {
StringBuilder sb = text.get();
sb.append(s);
}
public void println(String s) {
StringBuilder sb = text.get();
sb.append(s).append('\n');
// do something with sb.
}