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

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

Linda Hamilton
Linda Hamiltonoriginal
2024-11-18 08:20:02546parcourir

How to Redirect Process Output Asynchronously in Java?

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!

Déclaration:
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