Question

Lors du lancement d'un processus à partir de Java, stderr et stdout peuvent bloquer la sortie si je ne lis pas dans les tubes. Actuellement, j'ai un fil qui lit de manière proactive l'un des blocs de threads principaux de l'autre.

Existe-t-il un moyen simple de joindre les deux flux ou de laisser le sous-processus se poursuivre sans perdre les données dans stderr?

Était-ce utile?

La solution

Définissez la propriété redirectErrorStream sur ProcessBuilder pour envoyer la sortie stderr à stdout:

ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);

Vous devriez ensuite créer un thread pour gérer le flux de processus, comme suit:

Process p = builder.start();

InputHandler outHandler = new InputHandler(p.getInputStream());

Où InputHandler est défini comme:

private static class InputHandler extends Thread {

    private final InputStream is;

    private final ByteArrayOutputStream os;

    public InputHandler(InputStream input) {
        this.is = input;
        this.os = new ByteArrayOutputStream();
    }

    public void run() {
        try {
            int c;
            while ((c = is.read()) != -1) {
                os.write(c);
            }
        } catch (Throwable t) {
            throw new IllegalStateException(t);
        }
    }

    public String getOutput() {
        try {
        os.flush();
        } catch (Throwable t) {
            throw new IllegalStateException(t);
        }
        return os.toString();
    }

}

Vous pouvez également créer deux InputHandlers pour InputStream et ErrorStream. Sachant que le programme bloquera si vous ne les lisez pas, cela représente 90% de la bataille:)

Autres conseils

Vous n'avez que deux threads, l'un lisant sur stdout, l'autre sur stderr?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top