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