Redirección de salida sin bloqueo para ProcessBuilder
Para ejecutar procesos en Java, ProcessBuilder ofrece un enfoque conveniente. Sin embargo, el desafío surge cuando necesitamos redirigir asincrónicamente los flujos stdout y stderr del proceso ejecutado a System.out.
Redireccionamiento asincrónico usando Thread
Un método común Implica generar manualmente un nuevo hilo que lee continuamente desde stdOut y escribe en System.out. Si bien es funcional, este enfoque genera una sobrecarga adicional de administración de subprocesos.
Solución elegante con ProcessBuilder.inheritIO
Si está disponible Java 7 o posterior, ProcessBuilder proporciona una solución más sencilla y elegante. solución: ProcessBuilder.inheritIO. Este método establece los flujos de E/S estándar del subproceso para heredar los del proceso Java principal. command("command1").start();
Alternativa para versiones anteriores de JavaProcess p = new ProcessBuilder().inheritIO().command("command1").start();
Para versiones de Java antes de 7, se puede utilizar la siguiente implementación:import java.io.*; importar java.util.Scanner; importar java.util.concurrent.ExecutorService; importar java.util.concurrent.Executors; clase pública NonBlockingOutputRedirection { public static void main (String [] args) lanza una excepción { ExecutorService executorService = Executors.newSingleThreadExecutor(); Proceso p = Runtime.getRuntime().exec("cmd /c dir"); heredarIO(p.getInputStream(), System.out, executorService); heredarIO(p.getErrorStream(), System.err, executorService); } heredado vacío estático privado (src de flujo de entrada final, destino de flujo de impresión final, servicio de ejecutor servicio de ejecutor) { executorService.execute(() -> { Escáner escáner = nuevo escáner (src); mientras (scanner.hasNextLine()) { destino.println(scanner.nextLine()); } }); ejecutorService.shutdown(); } }
Ventajas de este métodoProcess p = new ProcessBuilder().inheritIO().command("command1").start();
Este método ofrece varias ventajas:
Asincrónico:
La redirección de salida se produce en el fondo, liberando el hilo principal.Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3