首页 >Java >java教程 >如何在 Java 中高效地异步重定向 ProcessBuilder 输出?

如何在 Java 中高效地异步重定向 ProcessBuilder 输出?

DDD
DDD原创
2024-11-23 20:38:11711浏览

How to Efficiently Redirect ProcessBuilder Output Asynchronously in Java?

ProcessBuilder 进程的异步输出重定向

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn