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