ホームページ  >  記事  >  Java  >  Java で ProcessBuilder 出力を非同期に効率的にリダイレクトする方法は?

Java で ProcessBuilder 出力を非同期に効率的にリダイレクトする方法は?

DDD
DDDオリジナル
2024-11-23 20:38:11657ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。