4
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”的命令的代码。但我无法通过这段代码获得实时输出。命令完成后输出。我想要实时输出。有没有办法做到这一点?

4

3 回答 3

3

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

于 2012-08-03T03:17:53.703 回答
0

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

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

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

于 2012-08-03T03:39:13.107 回答
0

实际上,问题在于Process.getInputStream()返回一个BufferedReader. 因此,即使被调用的子进程刷新其所有输出,调用 Java 程序中的读取也只会在缓冲区已满时获取它。

于 2019-12-04T12:02:13.253 回答