首页 > Java > java教程 > 如何在 Java 中异步捕获和重定向进程输出?

如何在 Java 中异步捕获和重定向进程输出?

DDD
发布: 2024-11-20 02:57:02
原创
1036 人浏览过

How to Capture and Redirect Process Output Asynchronously in Java?

异步捕获和重定向进程输出

使用 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板