我想要实时输出我的Runtime.getRuntime()。exec()

时间:2012-08-03 03:08:11

标签: java linux

public static void executeCommand(String cmd) {
    try {
        Process process = Runtime.getRuntime().exec(cmd, null,
                new File("/usr/hadoop-0.20.2/"));
        InputStream stdin = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(stdin);
        BufferedReader br = new BufferedReader(isr);
        String line;
        System.out.println("<output></output>");
        while ((line = br.readLine()) != null)
            System.out.println(line);
        InputStreamReader esr = new InputStreamReader(
                process.getErrorStream());
        BufferedReader errorReader = new BufferedReader(esr);
        String lineError;
        while ((lineError = errorReader.readLine()) != null)
            System.out.println(lineError);
        process.waitFor();
        System.out.println("");

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

这是我执行名为'cmd'的命令的代码。但我无法通过此代码获得实时输出。命令完成后输出结果。我想要实时输出。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

您描述的问题很可能是由您调用的应用程序引起的:许多应用程序在连接到终端时使用无缓冲的I / O,但在连接到管道时会使用I / O.所以你的cmd可能只是决定不以小比特写出它的输出,而是以巨大的块为单位。正确的解决方法是调整命令,在适当的时间刷新其输出。在Java方面你几乎无能为力。另请参阅this answer

答案 1 :(得分:0)

我认为你需要一个线程来处理输出。

您应首先尝试运行一段时间的cmd

上次,当我尝试使用wvdial命令时(这个wvdial在我们停止之前不会完成),我需要一个线程来读取wvdial的输出

答案 2 :(得分:0)

实际上,问题在于Process.getInputStream()返回BufferedReader。 因此,即使被调用的子进程刷新了其所有输出,也只有在缓冲区已满的情况下,调用Java程序中的读取操作才能获取该结果。