Dalam aplikasi Java, bagaimana seseorang boleh menangkap output stdout dan stderr subproses dilancarkan menggunakan ProcessBuilder dan ubah halanya ke System.out secara tidak segerak, membenarkan subproses dan pengalihan keluaran berjalan di latar belakang?
Pendekatan semasa melibatkan penciptaan utas baharu secara manual untuk terus membaca dari stdout dan menulis ke System.out , tetapi ia terasa menyusahkan dan memerlukan pengurusan benang tambahan. Adakah terdapat penyelesaian yang lebih elegan?
Dengan memanfaatkan ProcessBuilder.inheritIO, anda boleh menetapkan I/O standard subproses untuk mencerminkan proses Java semasa. Ini mengubah hala output subproses terus ke System.out tanpa memerlukan urutan yang berasingan.
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Jika menggunakan Java 7 tidak boleh dilaksanakan, pilihan lain ialah mengubah hala secara manual menggunakan benang:
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(); }
Pendekatan ini menggunakan urutan yang ditamatkan secara automatik apabila subproses selesai, apabila aliran input/ralat mencapai penghujungnya.
Atas ialah kandungan terperinci Bagaimana untuk Mengalihkan Output Subproses Secara Asynchronous di Java Tanpa Menyekat Benang Utama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!