异步捕获和重定向进程输出
使用 ProcessBuilder 启动进程时,有时需要转发其 stdout 和 stderr 输出而不阻塞主线程。默认情况下,从进程流中读取会阻塞调用者,使其不适合需要并发的任务。
实现异步输出重定向的一种方法是手动创建一个线程来持续监视 stdOut 流并将其内容写入系统.out.然而,这种方法可能很麻烦,并且需要额外的线程管理。
为了简化这个过程,ProcessBuilder 提供了继承IO 方法,该方法可以无缝地将子进程的标准 I/O 流设置为与子进程的标准 I/O 流相同。调用Java进程。这确保了子进程生成的任何输出都直接发送到控制台,而不需要手动创建线程:
Process p = new ProcessBuilder().inheritIO().command("command1").start();
或者,对于不支持inheritIO的旧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(); }
此实现创建监视子进程的输入和错误流的线程,分别将其数据转发到 System.out 和 System.err。当子进程完成时,线程会自动终止,因为输入流将到达其末尾。
以上是如何在 Java 中异步捕获和重定向进程输出?的详细内容。更多信息请关注PHP中文网其他相关文章!