将stdout重定向到swt。

时间:2012-04-18 10:38:56

标签: java swt system.out

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中的内容没有显示在我的应用程序中,它只是打印到控制台,任何想法为什么?

2 个答案:

答案 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挂起。