2008-09-15 10 views
4

Wenn Sie einen Prozess von Java starten, können stderr und stdout bei der Ausgabe blockieren, wenn ich nicht von den Pipes lese. Derzeit habe ich einen Thread, der proaktiv von einem und den Haupt-Thread-Blöcken auf dem anderen liest.Standardfehler abtragen in Java

Gibt es eine einfache Möglichkeit, die beiden Streams zu verbinden oder den Subprozess auf andere Weise fortzusetzen, ohne die Daten in stderr zu verlieren?

Antwort

4

die redirectErrorStream Eigenschaft Auf Process stderr Ausgabe an stdout senden:

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

Sie dann einen Thread befassen sich mit dem Prozessstrom, so etwas wie die folgenden erstellen sollten: Wo

Process p = builder.start(); 

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

InputHandler ist definiert als:

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, jus t Erstelle zwei InputHandler für den InputStream und ErrorStream. Zu wissen, dass das Programm blockiert, wenn Sie sie nicht lesen, ist 90% des Kampfes :)

0

Haben Sie nur zwei Threads, eine Lesung von stdout, eine von stderr?

+0

Ich würde das auch erwähnen ... aber es schien zu einfach. – jjnguy

+1

Ich erwähnte das in der Frage; Ich suchte nach einer Antwort, die nicht Thread-basiert war. –

Verwandte Themen