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

}

ストリームを閉じないのは良くないという事実に加えて、これまたはコード内の他の何かが、状況によっては出力が正しく読み取られない可能性がありますか?

ありがとう、

4

3 に答える 3

0

p.getInputStream()多分あなたはと置き換える必要がありますp.getOutputStream()

これに加えて、プロセスが入力の待機をブロックすることがあるため、非同期で読み取りと書き込みを行う必要があります。考えられる解決策の1つは、異なるスレッドを使用することです。たとえば、1つのスレッドが読み取り、もう1つが書き込み、もう1つがプロセスを監視します。

于 2012-04-30T11:47:31.067 に答える
0

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

このストリームのバッファがいっぱいになると、プログラムは停止し、あなたがそれを読むのを待ちます。

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

于 2012-04-30T11:48:19.653 に答える
0

ProcessBuilder で起動すると、エラー ストリームを出力ストリームに結合できます。このようにして、プログラムが stderr に出力する場合、これもキャプチャします。または、両方を読むこともできます。さらに、readLine を使用したくない場合があります。プログラムが最後に行末文字を出力しないと、しばらくスタックする可能性があります。

于 2012-04-30T11:47:20.023 に答える