0

.classユーザーがコンピューターから任意のファイルまたはファイルを選択できる Java プログラムを作成しようとしてい.jarます。JInternalFrame私のプログラムは、コンソールとして aを含む a をポップアップしJEditorPane、ユーザーのプログラムからのコンソール出力をキャプチャします。System.err または System.out 呼び出しだけをキャプチャするのではなく、コンソールに送られるすべての PrintStream 呼び出しをキャプチャすることに注意してください。

(実行中の IDE スタイル プログラムからの個別の質問)

4

2 に答える 2

3

次のようにSystem.out使用して、印刷されたすべてのものをキャッチできます。System.setOut

import java.io.*;

class SystemOutLogging {

    public static void main(String[] args) throws IOException,
                                                  ClassNotFoundException {
        final PrintStream original = System.out;

        System.setOut(new PrintStream("programlog.txt") {
            public void println(String str) {
                process(str + "\n");
            }

            public void print(String str) {
                process(str);
            }

            private void process(String str) {
                // Fill some JEditorPane
                original.println("Program printed: \"" + str + "\"");
            }
        });

        System.out.print("Hello ");
        System.out.println(" World");
    }
}

版画:

Program printed: "Hello "
Program printed: " World
"

(同様に動作するSystem.setErrandがあります。)System.setIn

「サブプログラム」が印刷するものをキャッチしたい場合は、静的System.out.printlnであるため、問題が発生しているため、複数の「サブプログラム」を起動すると、混乱してしまいます(別のクラスをSystem.out渡すことができないため)System各サブプログラム)。

このような状況では、ProcessBuilder を介して別のプロセスを起動する方がよいと正直に思います。結果のプロセスの標準入力/出力ストリームは、簡単にログに記録できます。

(ps 考えてみると、おそらくprintln実装内の現在のスレッド グループを確認し、そこから実際にprintlnメソッドを呼び出したサブプログラムを決定できます)

于 2010-10-29T19:43:41.573 に答える
0

Runtime.exec() を使用してユーザーの .jar ファイルを開始すると、Process オブジェクトが取得されます。そのオブジェクトにより、起動されたプロセス System.out、System.in、および System.err ストリームにアクセスできます。

参照: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html

err および out ストリームから読み取り、通常の setText タイプのメソッドを使用して JEditorPane に追加できます。

于 2010-10-29T21:18:59.810 に答える