ProcessBuilder: la Redirection de stdout et stderr de commencé le processus sans bloquer le thread principal

Je suis en train de construire un processus en Java à l'aide de ProcessBuilder comme suit:

ProcessBuilder pb = new ProcessBuilder()
        .command("somecommand", "arg1", "arg2")
        .redirectErrorStream(true);
Process p = pb.start();

InputStream stdOut = p.getInputStream();

Maintenant, mon problème est le suivant: je voudrais saisir tout ce qui se passe à travers stdout et/ou stderr de ce processus et de le rediriger vers System.out de manière asynchrone. Je veux le processus et ses redirection de la sortie d'exécuter en arrière-plan. Jusqu'à présent, le seul moyen que j'ai trouvé à faire c'est manuellement lancer un nouveau thread continue de lire à partir de stdOut et ensuite appeler le write() méthode de System.out.

new Thread(new Runnable(){
    public void run(){
        byte[] buffer = new byte[8192];
        int len = -1;
        while((len = stdOut.read(buffer)) > 0){
            System.out.write(buffer, 0, len);
        }
    }
}).start();

Alors que l'approche par type de travaux, il se sent un peu sale. Et en plus de cela, il me donne un fil en plus de gérer et de mettre fin correctement. Est-il meilleure façon de le faire?

  • Si le blocage du thread appelant était une option, il y aurait une solution très simple, même dans la version 6 de Java: org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);