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

根据javadocexecute(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? 您期望大数据,因此您必须使用管道流并且不能使用使用 aByteArrayInputStream作为输出的更简单的方法。您在此处给自己的答案与此处的代码存在相同的问题。

于 2010-04-24T09:06:30.890 回答