Drenante Errore Standard in Java
-
09-06-2019 - |
Domanda
Quando si avvia un processo di Java, sia stderr e stdout in grado di bloccare in uscita se non riesco a leggere dalla pipe.Attualmente ho un thread che pro-attivamente legge da un e il thread principale blocchi dell'altro.
C'è un modo semplice per unire le due torrenti o di causare il sottoprocesso per continuare pur di non perdere i dati in stderr?
Soluzione
Impostare il redirectErrorStream proprietà ProcessBuilder per inviare output su stdout stderr:
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
È quindi necessario creare un thread per affrontare il flusso di processo, qualcosa di simile al seguente:
Process p = builder.start();
InputHandler outHandler = new InputHandler(p.getInputStream());
Dove InputHandler è definito come:
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();
}
}
In alternativa, basta creare due InputHandlers per l'InputStream e ErrorStream.Sapendo che il programma si blocchi se non le leggerai è il 90% della battaglia :)
Altri suggerimenti
Basta avere due thread, uno di lettura da stdout, uno da stderr?