从Java运行外部程序,读取输出,允许中断

2022-09-03 05:44:21

我想从Java启动一个进程,读取其输出并获取其返回代码。但是当它正在执行时,我希望能够取消它。我从启动该过程开始:

ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
Process proc = pb.start();

如果我调用proc.waitFor(),在进程退出之前,我什么也做不了。所以我假设我需要这样的东西:

while (true) {
  see if process has exited
  capture some output from the process
  decide if I want to cancel it, and if so, cancel it
  sleep for a while
}

这是对的吗?有人可以给我一个如何在Java中做到这一点的例子吗?


答案 1

以下是我认为您想要执行的操作的示例:

ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
Process proc = pb.start();

InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

String line;
int exit = -1;

while ((line = br.readLine()) != null) {
    // Outputs your process execution
    System.out.println(line);
    try {
        exit = proc.exitValue();
        if (exit == 0)  {
            // Process finished
        }
    } catch (IllegalThreadStateException t) {
        // The process has not yet finished. 
        // Should we stop it?
        if (processMustStop())
            // processMustStop can return true 
            // after time out, for example.
            proc.destroy();
    }
}

你可以改进它:-)我现在没有一个真正的环境来测试它,但你可以在这里找到更多的信息。


答案 2

我建议查看Apache Commons Exec,以避免重新创建轮子。它具有一些不错的功能,例如在同步执行与异步执行之间进行选择,以及生成监视程序进程的标准解决方案,该方法可以帮助在执行时间,以防万一它被卡住。