使用 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中文網其他相關文章!