2008-09-15 12 views
4

Javaからプロセスを起動すると、パイプから読み込まないとstderrとstdoutの両方が出力をブロックする可能性があります。現在のところ、私はプロアクティブに1つのメインスレッドブロックと他のメインスレッドブロックから読み込むスレッドを持っています。Javaの排水標準エラー

2つのストリームを結合する簡単な方法がありますか、そうでない場合、stderrでデータを失わないでサブプロセスを続行させる方法はありますか?

答えて

4

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(); 
    } 

} 

また、jus InputStreamとErrorStreamの2つのInputHandlerを作成します。あなたがそれらを読んでいない場合、プログラムがブロックされることを知っていることは、戦いの90%です:)

0

ちょうど2つのスレッドがあります.1つはstdoutから読み込み、もう1つはstderrから読み込みますか?

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

あなたは、その後、プロセス流で、次のようなものを扱うためのスレッドを作成する必要があります:

Process p = builder.start(); 

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

stdoutに標準エラー出力を送信するためにProcessBuilderを上redirectErrorStreamプロパティを設定し

+0

私はあまりにも言及していた...しかし、それはあまりにも簡単だった。 – jjnguy

+1

私はその質問に言及しました。私はスレッドベースではない答えを探していました。 –

関連する問題