3

これがぶら下がっている理由がわかりません。commons-exec を介して実行されるプロセスからの出力を取得しようとしていますが、ハングし続けます。以下に、この動作を示すサンプル プログラムを示します。

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.PumpStreamHandler;
public class test {

public static void main(String[] args) {
    String command = "java";

    PipedOutputStream output = new PipedOutputStream();
    PumpStreamHandler psh = new PumpStreamHandler(output);

    CommandLine cl = CommandLine.parse(command);

    DefaultExecutor exec = new DefaultExecutor();
    DataInputStream is = null;
    try {
        is = new DataInputStream(new PipedInputStream(output));
        exec.setStreamHandler(psh);
        exec.execute(cl);
    } catch (ExecuteException ex) {
    } catch (IOException ex) {
    }

    System.out.println("huh?");
}
}
4

2 に答える 2

9

javadocによると、execute(CommandLine command)は同期ですが、execute(CommandLine command, ExecuteResultHandler handler)非同期です。

于 2010-04-24T06:09:53.143 に答える
5

呼び出したコマンド はjava、標準出力ストリームに出力を生成します。そのストリームは、呼び出し元のプログラムによって入力ストリームに送り込まれる必要があります。これは、プログラムでは発生しません。

入力ストリーム (isコード内) を別のスレッドで読み取る必要があります。これは、パイプされたストリームが機能するためです。を呼び出す前に読み取りスレッドを開始する必要があることに注意してくださいexecute()

Apache Commons-Exec からの大量の出力のキャプチャも参照してください。

あなたの他の質問Streaming output with commons-exec によると? ByteArrayInputStream大きなデータが予想されるため、パイプされたストリームを使用する必要があり、出力としてa を使用する単純な方法は使用できません。あなたがそこで自分自身に与える答えは、ここのコードと同じ問題に苦しんでいます。

于 2010-04-24T09:06:30.890 に答える