我正在以以下方式启动流程。

try {
    final Process mvnProcess = new ProcessBuilder("cmd", "/c", "mvn", "--version")
            .directory(new File(System.getProperty("user.dir")))
            .inheritIO()
            .start();
    System.exit(mvnProcess.waitFor());
} catch (final IOException ex) {
    System.err.format(IO_EXCEPTION);
    System.exit(1);
} catch (final InterruptedException ex) {
    System.err.format(INTERRUPTED_EXCEPTION);
    System.exit(1);
}

自从我调用inheritIO()以来,我一直期望控制台上子进程的输出,但是什么也没有出现。我在这里想念什么?

编辑:我知道我可以使用mvnProcess.getInputStream()并显式读取进程的输出,然后将其循环写入控制台(或任何位置)。但是,我不喜欢这种解决方案,因为循环会阻塞我的线程。 inheritIO()看起来很有前途,但是显然我不明白它是如何工作的。我希望这里有人可以对此有所启发。

最佳答案

从子流程中读取它也许是一个选择:

start()之后添加此代码,您将把它打印到stdout:

    InputStream is = mvnProcess.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line;
    while ((line = br.readLine()) != null)
    {
        System.out.println(line);
    }

关于java - 重定向Java中子进程的I/O(为什么ProcessBuilder.inheritIO()不起作用?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17525441/

10-10 01:01