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