Frage

Wenn Sie einen Prozess von Java gestartet, sowohl stderr und stdout können auf Ausgang sperren, wenn ich aus den Rohren nicht lesen. Zur Zeit habe ich einen Thread dass pro-aktiv von einer liest und die Haupt-Thread-Blöcke auf der anderen Seite.

Gibt es einen einfachen Weg, um die beiden Ströme oder auf andere Weise zu bewirken, dass der Teilprozess fortsetzen zu verbinden, während die Daten nicht in stderr zu verlieren?

War es hilfreich?

Lösung

Stellen Sie die redirectErrorStream Eigenschaft auf Process stderr Ausgabe an stdout senden:

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

Sie sollten dann einen Thread erstellen mit dem Prozessstrom, etwa wie folgt zu behandeln:

Process p = builder.start();

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

Wo InputHandler ist wie folgt definiert:

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

}

Alternativ erstellen nur zwei InputHandlers für die Input und FehlerVar. Zu wissen, dass das Programm sperren, wenn diese nicht in lesen ist 90% der Schlacht:)

Andere Tipps

Nur zwei Threads haben, eine Lesung von stdout, ein von stderr?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top