Capturer et rediriger la sortie du processus de manière asynchrone
Lors du lancement de processus à l'aide de ProcessBuilder, il est parfois nécessaire de transmettre leur sortie stdout et stderr sans bloquer le fil conducteur. Par défaut, la lecture à partir des flux de processus bloque l'appelant, ce qui le rend inadapté aux tâches nécessitant une simultanéité.
Une approche pour obtenir une redirection de sortie asynchrone consiste à créer manuellement un thread qui surveille en permanence le flux stdOut et écrit son contenu dans System.out. Cependant, cette approche peut être lourde et nécessite une gestion de threads supplémentaire.
Pour rationaliser ce processus, ProcessBuilder propose la méthodeheritIO, qui définit de manière transparente les flux d'E/S standard du sous-processus pour qu'ils soient les mêmes que ceux du sous-processus. appelant le processus Java. Cela garantit que toute sortie générée par le sous-processus est directement envoyée à la console sans qu'il soit nécessaire de créer manuellement un thread :
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Alternativement, pour les anciennes versions de Java qui ne prennent pas en chargeheritIO, une implémentation personnalisée utilisant des threads peut être employé :
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(); }
Cette implémentation crée des threads qui surveillent les flux d'entrée et d'erreur du sous-processus, transmettant leurs données à System.out et System.err, respectivement. Les threads se terminent automatiquement lorsque le sous-processus est terminé, car les flux d'entrée atteindront leur fin.
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!