Redirection de sortie asynchrone pour ProcessBuilder
Lors de l'exécution de processus en Java à l'aide de ProcessBuilder, la capture de stdout et stderr nécessite une approche non bloquante. Bien que la création d'un thread pour gérer la tâche de redirection soit une option, elle présente des inconvénients tels que la gestion et la terminaison des threads.
ProcessBuilder.inheritIO
Dans Java 7 et supérieur , ProcessBuilder propose la méthodeheritIO. Cette méthode simplifie la redirection de sortie en définissant les E/S standard du sous-processus pour qu'elles s'alignent sur celles du processus Java actuel.
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Cette syntaxe redirige de manière transparente stdout et stderr vers la console sans bloquer le thread principal.
Java 6 et versions antérieures
Pour Java 6 et versions antérieures, une solution plus explicite 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 implémentation, de nouveaux fils de discussion sont générés pour lire en continu depuis stdin et rediriger son contenu vers la destination souhaitée. Lorsque le sous-processus se termine, les threads se terminent automatiquement puisque le flux d'entrée atteint EOF.
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!