4

Java からプロセスを起動する場合、パイプから読み取らないと、stderr と stdout の両方が出力でブロックされる可能性があります。現在、一方から積極的に読み取るスレッドと、もう一方のメインスレッドブロックを持っています。

stderr のデータを失わずに 2 つのストリームを結合する、またはサブプロセスを継続させる簡単な方法はありますか?

4

2 に答える 2

4

ProcessBuilder の redirectErrorStream プロパティを設定して、stderr 出力を stdout に送信します。

ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);

次に、次のようなプロセス ストリームを処理するスレッドを作成する必要があります。

Process p = builder.start();

InputHandler outHandler = new InputHandler(p.getInputStream());

InputHandler は次のように定義されます。

private static class InputHandler extends Thread {

    private final InputStream is;

    private final ByteArrayOutputStream os;

    public InputHandler(InputStream input) {
        this.is = input;
        this.os = new ByteArrayOutputStream();
    }

    public void run() {
        try {
            int c;
            while ((c = is.read()) != -1) {
                os.write(c);
            }
        } catch (Throwable t) {
            throw new IllegalStateException(t);
        }
    }

    public String getOutput() {
        try {
        os.flush();
        } catch (Throwable t) {
            throw new IllegalStateException(t);
        }
        return os.toString();
    }

}

または、InputStream と ErrorStream 用に 2 つの InputHandler を作成するだけです。それらを読まないとプログラムがブロックされることを知ることは、戦いの90%です:)

于 2008-09-15T15:57:29.183 に答える
0

2 つのスレッドがあり、1 つは標準出力から、もう 1 つは標準エラー出力から読み取りますか?

于 2008-09-15T15:51:53.253 に答える