在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进程的源和目标相同。