使用 ProcessBuilder 构建进程时,可能需要异步捕获 stdout 和/或 stderr 并将其重定向到 System.out。传统的方法,比如手动生成一个线程来不断地从stdOut读取,既麻烦又低效。
幸运的是,Java 7引入了ProcessBuilder.inheritIO方法,可以方便地将子进程标准I/O设置为相同作为当前的 Java 进程。这消除了对额外线程或复杂输出重定向逻辑的需要。
对于 Java 7 及更高版本,只需调用:
Process p = new ProcessBuilder().inheritIO().command("command1").start();
对于早期版本的 Java,需要自定义解决方案:
public static void main(String[] args) throws Exception { Process p = Runtime.getRuntime().exec("cmd /c dir"); inheritIO(p.getInputStream(), System.out); inheritIO(p.getErrorStream(), System.err); } private static void inheritIO(final InputStream src, final PrintStream dest) { new Thread(new Runnable() { public void run() { Scanner sc = new Scanner(src); while (sc.hasNextLine()) { dest.println(sc.nextLine()); } } }).start(); }
在此自定义解决方案中,当子进程完成时,当 src 流达到 EOF 时,线程会自动终止。这确保了正确的资源管理,而不需要显式的线程处理。
以上是如何在 Java 中高效地异步重定向 ProcessBuilder 输出?的详细内容。更多信息请关注PHP中文网其他相关文章!