Pengalihan Output Tak Segerak untuk ProcessBuilder
Apabila melaksanakan proses dalam Java menggunakan ProcessBuilder, menangkap stdout dan stderr memerlukan pendekatan tanpa sekatan. Walaupun mencipta urutan untuk mengendalikan tugas ubah hala adalah pilihan, ia datang dengan kelemahan seperti pengurusan dan penamatan rangkaian.
ProcessBuilder.inheritIO
Dalam Java 7 dan ke atas , ProcessBuilder menawarkan kaedah inheritIO. Kaedah ini memudahkan pengalihan keluaran dengan menetapkan I/O standard subproses agar sejajar dengan proses Java semasa.
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Sintaks ini mengubah hala stdout dan stderr dengan lancar ke konsol tanpa menyekat utas utama.
Java 6 dan Terdahulu
Untuk Java 6 dan versi terdahulu, penyelesaian yang lebih jelas diperlukan:
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(); }
Dalam pelaksanaan ini, urutan baharu dihasilkan untuk membaca secara berterusan daripada stdin dan mengalihkan kandungannya ke destinasi yang dikehendaki. Apabila subproses selesai, urutan ditamatkan secara automatik sejak aliran input mencapai EOF.
Atas ialah kandungan terperinci Bagaimana untuk Mengalihkan Keluaran Proses Secara Asynchronously di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!