2012-04-30 9 views
0

.cshスクリプトを実行して、その出力をStringBufferに読み込もうとしています。 コンソールからスクリプトを実行すると出力が返されますが、出力は空に戻ります。同じ実行中のフローが出力を返すこともありますが、プロセスが開始される方法(同じスクリプト、パス、引数)で何も変更されず、スクリプトも変更されないことがあります。 例外がスローされません。 出力が正しく読み込まれるようになるにはどうすればよいでしょうか? は、コードセグメントが外部プロセスからの出力を読み取る

public static String getOutpoutScript(Process p) { 
    InputStream outpout = p.getInputStream(); 
    logger.info("Retrived script output stream"); 
    BufferedReader buf = new BufferedReader(new InputStreamReader(outpout)); 
    String line = ""; 
    StringBuffer write = new StringBuffer(); 

    try { 
     while ((line = buf.readLine()) != null) { 
      write.append(line); 
     } 
    } catch (IOException e) { 
     // do something 
    } 

    return write.toString().trim(); 

} 

ストリームを閉じていない事実はよくないです横に、このまたはコードで何か他のものは、いくつかの状況下で正しく読まれてからの出力を妨げる可能性があるだろうか?

おかげで、

+0

(あなたがそのp.getInputStreamを見るためにデバッグが)は常に同じであり、 'output'が正しく割り当てられていますか? – MarioDS

+0

http://stackoverflow.com/questions/10365402/java-process-invoked-by-processbuilder-sleeps-forever/と同じ問題が発生する可能性があります – Attila

答えて

0

あなたがProcessBuilderをとそれを起動した場合、あなたはcombine the error stream into the output stream.この方法では、プログラムのプリントがあなたもこれをキャプチャしますstderrにすることができます。あるいは、あなたは両方を読むことができます。さらに、readLineを使用したくない場合もあります。最後に行末の文字が表示されない場合は、しばらく待つことができます。

+0

スクリプトの出力は常に同じ形式(4行、それぞれ5語)。 readLineは問題のようには見えません。私はエラーストリームを読むことを試みます。ありがとう。 –

0

たぶん、あなたはあなたが読んで、非同期的に書き込む必要がありますので、入力に待ってブロックすることができ、この時々のプロセスのほかにp.getOutputStream()

p.getInputStream()を交換する必要があります - 一つの可能​​な解決策は、別のスレッドを使用することである - 例えば1つのスレッドは読み取り、もう1つは書き込み、もう1つはプロセスを監視しています。

+0

エラーストリームと入力ストリームを切り替えることができます。しかし、このコンテキストでは、出力ストリームへの切り替えは意味をなさない –

+0

混乱しますが、InputStreamはJavaへのInputStreamですが、プログラムの出力ストリーム(およびその逆) –

+0

は、あなたの視点からストリームを見る必要があります。プロセスではなく、あなたがどこかに書いておきたい場合(出力を作成する)、出力ストリームを使用したい場合は、読み込み(入力を得る)、入力ストリームを使用する –

0

エラーが発生した場合、デフォルトでgetErrorStream()に書き込まれます。問題がある場合、私はあなたがどこかでこれを読んでいることを確認します。

このストリームのバッファがいっぱいになると、プログラムは停止し、読み込みを待機します。

これらの問題の周りの簡単な方法はProcessBuilder .redirectErrorStream(true)を使用することです

関連する問題