Pregunta

Cuando el inicio de un proceso de Java, tanto en stderr y stdout puede bloquear en la salida si no me la lectura de las tuberías.Actualmente tengo un hilo que pro-activamente lee de uno y el hilo principal de bloques en el otro.

Hay una manera fácil de unir las dos corrientes o de otra manera causar el subproceso para continuar mientras no perder los datos en stderr?

¿Fue útil?

Solución

Establecer el redirectErrorStream propiedad en ProcessBuilder para enviar la salida stderr a stdout:

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

A continuación, usted debe crear un hilo para tratar con la corriente de proceso, algo como lo siguiente:

Process p = builder.start();

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

Donde InputHandler se define como:

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();
    }

}

Alternativamente, sólo tienes que crear dos InputHandlers para el InputStream y ErrorStream.Sabiendo que el programa se bloquea si no las lee es el 90% de la batalla :)

Otros consejos

Sólo tiene dos roscas, una lectura de salida estándar (stdout), uno de stderr?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top