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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top