Maison >Java >javaDidacticiel >Comment rediriger efficacement la sortie de ProcessBuilder de manière asynchrone en Java ?

Comment rediriger efficacement la sortie de ProcessBuilder de manière asynchrone en Java ?

DDD
DDDoriginal
2024-11-23 20:38:11709parcourir

How to Efficiently Redirect ProcessBuilder Output Asynchronously in Java?

Redirection de sortie asynchrone pour les processus ProcessBuilder

Lors de la construction d'un processus avec ProcessBuilder, il peut être souhaitable de capturer et de rediriger stdout et/ou stderr vers System.out de manière asynchrone. Les approches traditionnelles, telles que la création manuelle d'un thread pour une lecture continue à partir de stdOut, sont lourdes et inefficaces.

Heureusement, Java 7 a introduit la méthode ProcessBuilder.inheritIO, qui définit commodément les E/S standard du sous-processus pour qu'elles soient les mêmes. comme le processus Java actuel. Cela élimine le besoin de threads supplémentaires ou de logique de redirection de sortie complexe.

Pour Java 7 et versions ultérieures, invoquez simplement :

Process p = new ProcessBuilder().inheritIO().command("command1").start();

Pour les versions antérieures de Java, une solution personnalisée 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 solution personnalisée, les threads sont automatiquement terminés lorsque le sous-processus se termine, lorsque le flux src atteint EOF. Cela garantit une gestion appropriée des ressources sans avoir besoin d'une gestion explicite des threads.

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