【问题标题】:I want realtime output of my Runtime.getRuntime().exec()我想要我的 Runtime.getRuntime().exec() 的实时输出
【发布时间】:2012-08-03 03:08:11
【问题描述】:
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”的命令的代码。但我无法通过这段代码获得实时输出。命令完成后输出。我想要实时输出。有没有办法做到这一点?

【问题讨论】:

  • 您能否澄清一下实时输出与命令执行时的含义。你的意思是像'ls'产生的列表和完成代码?

标签: java linux


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    你应该先用运行一段时间的 cmd 试试

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 2015-12-09
        • 1970-01-01
        相关资源
        最近更新 更多