Java - 完成后读取进程输出

时间:2015-06-09 07:07:55

标签: java process output

我的代码中存在问题

ProcessBuilder pb = new ProcessBuilder("my program.exe","-g");
Process core = pb.start();
if(!core.waitFor(5, TimeUnit.HOURS))
{
    isDestroyed = true;
    core.destroy();
}
else
    isDestroyed = false;

String xmlOutput = IOUtils.toString(core.getInputStream());

问题是它一直工作5个小时,但是当我从控制台运行它时,它的工作时间<10秒。有什么问题?操作系统是Windows 8.1 64位。

我希望它与从控制台同时运行。或者还有另一种获得输出的好方法?如果是,请说明如何。感谢

3 个答案:

答案 0 :(得分:0)

你等了5个小时,等待进程退出,等待你消耗一些输入,所以它不会被阻止生成它以便它可以退出。

您应首先使用输入,然后执行waitFor().

注意您还需要关闭流程的输出流,以便它不会等待输入。

答案 1 :(得分:0)

您可以让您的流程返回其正在处理的输出while

ProcessBuilder pb = new ProcessBuilder("my program.exe","-g");
Process core = pb.start();
InputStream stream = core.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
String line;
StringBuilder stringBuilder = new StringBuilder();
long end = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(5);

while (System.currentTimeMillis() < end && (line = reader.readLine()) != null) {
    stringBuilder.append(line);
}
stream.close();
String xmlOutput = stringBuilder.toString();

答案 2 :(得分:0)

在另一个线程中使用进程的STDOUT。主线程等待进程终止。

    ProcessBuilder pb = new ProcessBuilder("my program.exe","-g");
    Process core = pb.start();
    InputStream stream = core.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
    StringBuilder stringBuilder = new StringBuilder();
    new Thread(() -> {
        try {
            String line;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (IOException ex) {
        }
    }).start();;
    if(!core.waitFor(5, TimeUnit.HOURS)) {
        isDestroyed = true;
        core.destroy();
    } else
        isDestroyed = false;