ProcessBuilder のノンブロッキング出力リダイレクト
Java でプロセスを実行するために、ProcessBuilder は便利なアプローチを提供します。ただし、実行されたプロセスの stdout ストリームと stderr ストリームを System.out に非同期にリダイレクトする必要がある場合に課題が発生します。
Thread を使用した非同期リダイレクト
1 つの一般的な方法これには、stdOut からの読み取りと System.out への書き込みを継続的に行う新しいスレッドを手動で生成することが含まれます。このアプローチは機能しますが、追加のスレッド管理オーバーヘッドが発生します。
ProcessBuilder.inheritIO を使用したエレガントなソリューション
Java 7 以降が利用可能な場合、ProcessBuilder はよりシンプルでエレガントなソリューションを提供します。解決策: ProcessBuilder.inheritIO。このメソッドは、親 Java プロセスの標準 I/O ストリームを継承するようにサブプロセスの標準 I/O ストリームを設定します。
inheritIO の使用は簡単です:
Process p = new ProcessBuilder().inheritIO().command("command1").start();
以前の Java バージョンの代替
7 より前の Java バージョンの場合、次の実装が可能です。使用:
import java.io.*; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NonBlockingOutputRedirection { public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newSingleThreadExecutor(); Process p = Runtime.getRuntime().exec("cmd /c dir"); inheritIO(p.getInputStream(), System.out, executorService); inheritIO(p.getErrorStream(), System.err, executorService); } private static void inheritIO(final InputStream src, final PrintStream dest, ExecutorService executorService) { executorService.execute(() -> { Scanner scanner = new Scanner(src); while (scanner.hasNextLine()) { dest.println(scanner.nextLine()); } }); executorService.shutdown(); } }
このメソッドの利点
このメソッドにはいくつかの利点があります:
全体として、Java 7 以降、または以前のバージョンの代替実装で ProcessBuilder.inheritIO を使用すると、クリーンで効率的な方法で次のことを実現できます。 ProcessBuilder で開始されたプロセスのノンブロッキング出力リダイレクト。
以上がProcessBuilder のノンブロッキング出力リダイレクトを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。