El drenaje de Error Estándar en Java
-
09-06-2019 - |
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?
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?