0
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 のコンテンツがアプリケーションに表示されず、コンソールに出力されるだけです。なぜでしょうか?

4

2 に答える 2

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 がハングする原因となる を呼び出すのではなく、新しいスレッドを開始する必要があります。

于 2012-04-18T11:01:36.977 に答える
0

私はswtプログラミングに慣れていません。しかし、stdout をリダイレクトする方法は、System.setErr を呼び出すときに行ったように、PrintStream を実装するカスタマイズされたオブジェクトに出力ストリームを設定することであることを覚えています。このオブジェクトのprintメソッドは、GUI を更新する方法を認識します

于 2012-04-18T10:52:10.820 に答える