首頁 > Java > java教程 > 主體

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

Linda Hamilton
發布: 2024-11-18 08:20:02
原創
558 人瀏覽過

How to Redirect Process Output Asynchronously in Java?

ProcessBuilder 的非同步輸出重新導向

使用 ProcessBuilder 在 Java 中執行進程時,擷取 stdout 和 stderr 需要採用非阻塞方法。雖然建立執行緒來處理重定向任務是一種選擇,但它存在執行緒管理和終止等缺點。

ProcessBuilder.inheritIO

在 Java 7 及更高版本中,ProcessBuilder提供了inheritIO方法。此方法透過將子進程標準 I/O 設定為與目前 Java 進程的標準 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();
}
登入後複製

在此實作中,新執行緒產生以連續從標準輸入讀取並將其內容重定向到所需的目的地。當子程序完成時,執行緒會自動終止,因為輸入流達到 EOF。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板