Ubah Hala Keluar Tanpa Sekat untuk ProcessBuilder
Untuk melaksanakan proses dalam Java, ProcessBuilder menawarkan pendekatan yang mudah. Walau bagaimanapun, cabaran timbul apabila kita perlu mengubah hala strim stdout dan stderr secara tak segerak bagi proses yang dilaksanakan ke System.out.
Asynchronous Redirection using Thread
Satu kaedah biasa melibatkan penumbuhan benang baharu secara manual yang membaca secara berterusan daripada stdOut dan menulis ke Sistem.keluar. Walaupun berfungsi, pendekatan ini mencipta overhed pengurusan benang tambahan.
Penyelesaian Elegan dengan ProcessBuilder.inheritIO
Jika Java 7 atau lebih baru tersedia, ProcessBuilder menyediakan yang lebih ringkas dan lebih elegan penyelesaian: ProcessBuilder.inheritIO. Kaedah ini menetapkan strim I/O standard subproses untuk mewarisi proses Java induk.
Menggunakan inheritIO adalah mudah:
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Alternatif untuk Versi Java Terdahulu
Untuk versi Java sebelum 7, pelaksanaan berikut boleh digunakan:
import java.io.*; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NonBlockingOutputRedirection { public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newSingleThreadExecutor(); Process p = Runtime.getRuntime().exec("cmd /c dir"); inheritIO(p.getInputStream(), System.out, executorService); inheritIO(p.getErrorStream(), System.err, executorService); } private static void inheritIO(final InputStream src, final PrintStream dest, ExecutorService executorService) { executorService.execute(() -> { Scanner scanner = new Scanner(src); while (scanner.hasNextLine()) { dest.println(scanner.nextLine()); } }); executorService.shutdown(); } }
Kelebihan Kaedah ini
Kaedah ini menawarkan beberapa kelebihan:
Secara keseluruhannya, menggunakan ProcessBuilder.inheritIO dalam Java 7 atau lebih baru, atau pelaksanaan alternatif untuk versi terdahulu, menyediakan yang bersih dan cekap cara untuk mencapai pengalihan keluaran tanpa sekatan untuk proses yang dimulakan dengan ProcessBuilder.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Ubah Arah Output Tidak Menyekat untuk ProcessBuilder?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!