在Java 應用程式中,如何擷取子程式的stdout 和stderr 輸出使用ProcessBuilder 啟動並非同步重定向到System.out,允許子進程和輸出重定向在背景執行?
目前的方法是手動建立一個新執行緒來不斷從 stdout 讀取並寫入 System.out ,但是感覺很麻煩,需要額外的執行緒管理。有沒有更優雅的解決方案?
利用 ProcessBuilder.inheritIO,您可以設定子進程的標準 I/O 來鏡像目前 Java 進程的標準 I/O。這會將子程序的輸出直接重定向到 System.out,而不需要單獨的執行緒。
Process p = new ProcessBuilder().inheritIO().command("command1").start();
如果使用Java 7 不可行,另一種選擇是使用線程手動重定向:
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(); }
此方法利用線程,當子進程完成時,當輸入/錯誤流到達末端時,執行緒會自動終止。
以上是如何在 Java 中非同步重定向子程序輸出而不阻塞主執行緒?的詳細內容。更多資訊請關注PHP中文網其他相關文章!