3

Javaを使用してGUIを作成しています。この GUI は、ProcessBuilder クラスを使用してコマンド ラインからプログラムを起動します。

起動中のプロセスに関する小さな情報: コマンドラインから、別のウィンドウを作成し、そのウィンドウに情報を出力します。

私のGUIウィンドウには、出力をリダイレクトしたい場所へのテキスト領域があります。私は当初、SwingWorker オブジェクトを使用して、より多くの出力を常にチェックし、GUI を保持しないようにするつもりでした。テストして元の構文がダウンしていることを確認するために (GUI を使用することさえせずに)、2 次プロセスのウィンドウからの出力を System.out に出力すると考えました。ただし、セカンダリ プロセスのウィンドウには出力が表示されますが、作業している端末には表示されないため、何かがおかしいようです。

コードの抜粋は次のとおりです。

Process p = pb.start(); 
Scanner s = new Scanner(p.getInputStream());

SwingWorker pipe = new SwingWorker<String, Void> (){
    public String doInBackground(){
        while(run){
            if(s.hasNextLine()){
                System.out.println("S has next!");
                System.out.println(s.nextLine());
            }
        }
        return null;
    }
};
pipe.execute();

ブール値の run はプログラムの別の場所で定義され、プロセス p が終了するか強制終了されると false に設定されます (追加の質問: それは本当に悪い考えですか? 私はそうかもしれないと感じています...)。

他のウィンドウに出力されているのを見たときに出力が得られない理由について、誰かが考えを持っていますか? 当初、私の反応は p.getOutputStream() を使用することでしたが、スキャナーはパラメーターとして outputStream を取りません。

お時間をいただきありがとうございます。

4

2 に答える 2

3

また、スキャンする必要がありますp.getErrorStream()-一部のプログラムは、コマンドラインから実行したときにSTDOUTと区別できないSTDERRに書き込みます。どちらか一方が消費されないと、外部プロセスがハングアップする可能性があるため、両方のストリームを消費することをお勧めします。

于 2010-01-05T22:55:35.150 に答える
2

外部プロセスがその出力を独自のウィンドウに書き込んでいる場合、出力が STDOUT に書き込まれていないことはほぼ確実です。これは、コードで読み取っているものです。その場合、外部プログラムの出力は、そのウィンドウと、それを起動したコマンド ライン セッション (存在する場合) の両方に表示されます。外部プログラムのソースにアクセスできなければ、作成者がその機能 (つまり、出力をウィンドウではなく STDOUT にリダイレクトするコマンドライン スイッチ) を用意しない限り、その出力を傍受できる可能性は低いでしょう。

に関してはp.getOutputStream()、それはあなたの観点から「出力」されるストリームを返します-つまり、プロセスのSTDINにデータを送信するためにそれに書き込みます。p.getInputStream()外部プログラムがその STDOUT に書き込む場合は、 の使用が正しいでしょう。

于 2010-01-05T18:55:29.090 に答える