Display disp = Display.getCurrent();
disp.asyncExec(new Runnable() {
public void run(){
try {
PipedOutputStream pos = new PipedOutputStream();
System.setErr( new PrintStream(pos, true) );
System.setOut( new PrintStream(pos, true) );
PipedInputStream pis = new PipedInputStream( pos );
BufferedReader reader = new BufferedReader( new InputStreamReader(pis) );
String line = null;
while (true){
line = reader.readLine(); // != null)
console.append(line);
System.out.println("moo" + line);
parent.layout(true,true);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
我正在尝试捕获System.err的内容,以便在我的应用程序的调试窗口中打印出来。我可以运行上面的代码但是System.err中的内容没有显示在我的应用程序中,它只是打印到控制台,任何想法为什么?
答案 0 :(得分:0)
我不熟悉swt编程。但我记得重定向stdout的方法是将输出流设置为实现PrintStream的自定义对象,就像调用System.setErr一样。该对象的print
方法将知道如何更新GUI
答案 1 :(得分:0)
问题在于你无限回应System.out
。您可能想要做的是将旧System.out
存储在run()
的开头,并在那里回显,而不是在您的读取循环中回显到新的System.out
。
PrintStream oldOut = System.out;
// ... set out and err
while(true) {
...
oldOut.println("moo" + line);
}
修改强>
此外,您希望启动一个新线程而不是调用asyncExec()
,它在EDT上运行,因此会导致您的GUI挂起。