ホームページ  >  記事  >  Java  >  Javaでプロセス出力を非同期にリダイレクトするにはどうすればよいですか?

Javaでプロセス出力を非同期にリダイレクトするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-18 08:20:02546ブラウズ

How to Redirect Process Output Asynchronously in Java?

ProcessBuilder の非同期出力リダイレクト

ProcessBuilder を使用して Java でプロセスを実行する場合、stdout と stderr をキャプチャするにはノンブロッキング アプローチが必要です。リダイレクト タスクを処理するスレッドを作成することはオプションですが、スレッドの管理や終了などの欠点があります。

ProcessBuilder.inheritIO

Java 7 以降, ProcessBuilder は、inheritIO メソッドを提供します。このメソッドは、現在の Java プロセスの標準 I/O と一致するようにサブプロセスの標準 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();
}

この実装では、新しいスレッドstdin から継続的に読み取り、その内容を目的の宛先にリダイレクトするために生成されます。サブプロセスが終了すると、入力ストリームが EOF に達するため、スレッドは自動的に終了します。

以上がJavaでプロセス出力を非同期にリダイレクトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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