Maison > Java > javaDidacticiel > Comment capturer et rediriger la sortie du processus de manière asynchrone en Java ?

Comment capturer et rediriger la sortie du processus de manière asynchrone en Java ?

DDD
Libérer: 2024-11-20 02:57:02
original
1052 Les gens l'ont consulté

How to Capture and Redirect Process Output Asynchronously in Java?

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();
Copier après la connexion

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();
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal