Lors de la construction d'un processus avec ProcessBuilder, il peut être souhaitable de capturer et de rediriger stdout et/ou stderr vers System.out de manière asynchrone. Les approches traditionnelles, telles que la création manuelle d'un thread pour une lecture continue à partir de stdOut, sont lourdes et inefficaces.
Heureusement, Java 7 a introduit la méthode ProcessBuilder.inheritIO, qui définit commodément les E/S standard du sous-processus pour qu'elles soient les mêmes. comme le processus Java actuel. Cela élimine le besoin de threads supplémentaires ou de logique de redirection de sortie complexe.
Pour Java 7 et versions ultérieures, invoquez simplement :
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Pour les versions antérieures de Java, une solution personnalisée est requise :
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(); }
Dans cette solution personnalisée, les threads sont automatiquement terminés lorsque le sous-processus se termine, lorsque le flux src atteint EOF. Cela garantit une gestion appropriée des ressources sans avoir besoin d'une gestion explicite des threads.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!