首頁  >  文章  >  Java  >  如何在 Java 中有效率地非同步重定向 ProcessBuilder 輸出?

如何在 Java 中有效率地非同步重定向 ProcessBuilder 輸出?

DDD
DDD原創
2024-11-23 20:38:11657瀏覽

How to Efficiently Redirect ProcessBuilder Output Asynchronously in Java?

ProcessBuilder 進程的非同步輸出重新導向

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn