在Java中重定向子进程的I/O(为什么ProcessBuilder.inheritIO()不工作?)

Rin*_*nke 6 java io process

我正在以下列方式启动一个过程.

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);
}
Run Code Online (Sandbox Code Playgroud)

自从我调用后,inheritIO()我期待控制台上的子进程输出,但什么都没有出现.我在这里错过了什么?

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

小智 2

也许这是一个从子进程中读取它的选项:

添加此代码后start(),您将把它打印到标准输出:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 是的,我知道。它有效(+1)。但是,只有当我省略“inheritIO()”时它才有效。我希望找出如何使 `inheritIO()` 工作并摆脱 while 循环,因为它阻塞了我的线程。 (2认同)