Dans une application Java, comment capturer la sortie stdout et stderr d'un sous-processus lancé à l'aide de ProcessBuilder et redirigez-le vers System.out de manière asynchrone, permettant au sous-processus et à la redirection de sortie de s'exécuter dans le background?
L'approche actuelle implique la création manuelle d'un nouveau thread pour lire en continu depuis stdout et écrire sur System.out, mais cela semble fastidieux et nécessite une gestion supplémentaire des threads. Existe-t-il une solution plus élégante ?
En tirant parti de ProcessBuilder.inheritIO, vous pouvez définir les E/S standard du sous-processus pour qu'elles reflètent celles du processus Java actuel. Cela redirige la sortie du sous-processus directement vers System.out sans nécessiter de thread séparé.
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Si l'utilisation de Java 7 n'est pas réalisable, une autre option consiste à rediriger manuellement à l'aide de threads :
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 approche utilise des threads qui se terminent automatiquement lorsque le sous-processus est terminé, lorsque les flux d'entrée/d'erreur atteignent 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!