首頁 >Java >java教程 >如何在 Java 中異步捕獲和重定向進程輸出?

如何在 Java 中異步捕獲和重定向進程輸出?

DDD
DDD原創
2024-11-20 02:57:021052瀏覽

How to Capture and Redirect Process Output Asynchronously in Java?

非同步擷取與重新導向進程輸出

使用ProcessBuilder 啟動進程時,有時需要轉送其stdout 和stderr 輸出而不阻塞主執行緒。預設情況下,從進程流中讀取會阻塞呼叫者,使其不適合需要並發的任務。

實現非同步輸出重定向的一種方法是手動建立一個執行緒來持續監視stdOut 流並將其內容寫入系統.out.然而,這種方法可能很麻煩,並且需要額外的執行緒管理。

為了簡化這個過程,ProcessBuilder 提供了繼承IO 方法,該方法可以無縫地將子進程的標準 I/O 流設定為與子進程的標準 I/O 流相同。呼叫Java進程。這確保了子程序產生的任何輸出都直接傳送到控制台,而不需要手動建立執行緒:

Process p = new ProcessBuilder().inheritIO().command("command1").start();

或者,對於不支援inheritIO的舊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();
}

此實作建立監視子程序的輸入和錯誤流的線程,分別將其資料轉送到System.out 和System.err。當子程序完成時,執行緒會自動終止,因為輸入流將到達其末尾。

以上是如何在 Java 中異步捕獲和重定向進程輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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