7

プロセスからエラー ストリームを読み取る Java プログラムを作成しています。以下は私のコードの構造です -

ProcessBuilder probuilder = new ProcessBuilder( command );              
Process process = probuilder.start(); 
InputStream error = process.getErrorStream();
InputStreamReader isrerror = new InputStreamReader(error);
BufferedReader bre = new BufferedReader(isrerror);
while ((linee = bre.readLine()) != null) {
        System.out.println(linee);
    }

上記のコードは、呼び出されたプロセスのエラー ストリームに実際に何かが書き込まれていれば問題なく動作します。ただし、エラー ストリームに何も書き込まれない場合、readLine の呼び出しは実際には無期限にハングします。ただし、すべてのシナリオで機能するように、コードを汎用的にしたいと考えています。同じことを達成するためにコードを変更するにはどうすればよいですか。

よろしく、開発

4

2 に答える 2

3

readline()ブロッキングコールです。読み取る行がある (行末文字で終了する) か、基になるストリームが閉じられる (EOF を返す) までブロックされます。

十分に長く待っていると判断した場合 (または別のことをしたい場合は、再度チェックする場合) をチェックするBufferedReader.ready()か、単に使用して救済するロジックが必要です。BufferedReader.read()

追加する編集:そうは言っても、そのまま「無期限に」ハングするべきではありません。呼び出されたプロセスが終了すると、戻ります。ひょっとして、呼び出されたプロセスも に何かを出力していstdoutませんか? その場合...そこからも読み取る必要があります。そうしないと、バッファーがいっぱいになり、外部プロセスがブロックされて終了できなくなり、...問題が発生します。

于 2012-10-16T06:34:34.817 に答える
2

これは遅い返信ですが、問題は実際には解決されておらず、一部の検索では最初のページにあります. 私は同じ問題を抱えていましたが、BufferedReader.ready()それでもロックする状況を設定していました。

永続的なストリームを取得する必要がある場合、次の回避策は機能しません。ただし、プログラムを実行して終了するのを待っているだけの場合は、これで問題ありません。

私が使用している回避策は、を呼び出すことProcessBuilder.redirectError(File)です。次に、ファイルを読み取り、それを使用してエラー ストリームをユーザーに表示します。うまくいきました、ロックしませんでした。Process.destroyForcibly()Process.waitFor() の後に呼び出しましたが、これはおそらく不要です。

以下の擬似コード:

    File thisFile = new File("somefile.ext");
    ProcessBuilder pb = new ProcessBuilder(yourStringList);
    pb.redirectError(thisFile);
    プロセス p = pb.start();
    p.waitFor();
    p.destroyForcibly();
    ArrayList fileContents = getFileContents(thisFile);

これが少なくともいくつかのユースケースに役立つことを願っています.

于 2015-10-07T15:11:27.873 に答える