无法从外部进程读取流

时间:2015-10-01 09:08:55

标签: java process processbuilder

以下是我编写的程序,用于在linux中启动进程并在控制台中打印结果。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Driver {
    public static void main(String[] args) {
        try {
            Process process = new ProcessBuilder("/usr/bin/R").start();
            InputStream is = process.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line;

            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我期待在终端中启动R时将显示的R版本和其他内容将在控制台中打印。但没有任何印刷品,也没有例外。

这里有什么问题?

修改

当我使用像" ls"这样的命令时,上面的程序有效。或" ps"。但不适用于任何不由自己退出的命令

1 个答案:

答案 0 :(得分:2)

当进程在一个单独的线程中启动时,br在执行到达循环时可能只有错误的状态。

原始解决方案:如果您不需要与已启动的流程进行交互,则可以在循环之前添加process.waitFor()以确保流程已完成且输出可用。

通常,与外部进程的交互将需要单独的线程来监视其状态,读取std out和std err流。在这种情况下,使用库解决方案是有意义的,例如, Apache Commons Exec(见the tutorial