ProcessBuilder 的异步输出重定向
使用 ProcessBuilder 在 Java 中执行进程时,捕获 stdout 和 stderr 需要采用非阻塞方法。虽然创建线程来处理重定向任务是一种选择,但它存在线程管理和终止等缺点。
ProcessBuilder.inheritIO
在 Java 7 及更高版本中,ProcessBuilder提供了inheritIO方法。此方法通过将子进程标准 I/O 设置为与当前 Java 进程的标准 I/O 保持一致来简化输出重定向。
Process p = new ProcessBuilder().inheritIO().command("command1").start();
此语法将 stdout 和 stderr 无缝重定向到控制台,而不会阻塞主线程。
Java 6 及更早版本
对于 Java 6 及更早版本,需要更明确的解决方案:
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(); }
在此实现中,新线程生成以连续从标准输入读取并将其内容重定向到所需的目的地。当子进程完成时,线程会自动终止,因为输入流达到 EOF。
以上是如何在 Java 中异步重定向进程输出?的详细内容。更多信息请关注PHP中文网其他相关文章!