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

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

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); } 

您可以使用.redirectError(Redirect.INHERIT)。 它将子进程标准I / O的源和目标设置为与当前Java进程的源和目标相同。