"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo lograr una redirección de salida sin bloqueo para ProcessBuilder?

¿Cómo lograr una redirección de salida sin bloqueo para ProcessBuilder?

Publicado el 2024-12-13
Navegar:731

How to Achieve Non-Blocking Output Redirection for ProcessBuilder?

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 Java
Process 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étodo
Process 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.
  • Terminación automática del hilo: Cuando se completa el subproceso, los hilos responsables de la salida la redirección finalizará automáticamente debido al fin del archivo en los flujos de entrada.
  • En general, usar ProcessBuilder.inheritIO en Java 7 o posterior, o la implementación alternativa para versiones anteriores, proporciona una solución limpia y eficiente. forma de lograr una redirección de salida sin bloqueo para procesos iniciados con ProcessBuilder.
Último tutorial Más>

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