Programm starten und Ausgabe überwachen

M_Kay

Mitglied
Hi,

ich habe eine Klasse, welche ein Programm starten soll und dabei dessen StdOut und ErrOut überwachen soll (in diesem Fall einfach nur ausgeben.)

Folgendermaßen sieht mein Code derzeit aus:
Code:
ProcessBuilder pb = new ProcessBuilder(this.getCommand());
Process p = pb.start();

BufferedReader out = new BufferedReader(new InputStreamReader(p.getInputStream()),100);
		    
while ((String line = out.readLine()) != null) {
	System.out.println(line);
}
Das Problem ist, dass das, was das aufgerufene Programm ausgibt, erst nach dem Beenden des Programms auf der Konsole ausgegeben wird.

Weiss jemand woran das liegt, bzw. wie ich das beheben kann?
Ich habe schon versucht die Buffer-Size vom BufferedReader zu verringern oder direkt auf dem InputStream zu arbeiten, doch alles hat nicht funktioniert :(
 
Hi,
du kannst ja mal den Aufruf von pb.start in einen speraten Thread packen, dann die Schleife so umschreiben, dass immer von einem Stream eingelesen wird( Ist zwar ein Chat, aber die Technik mit der Schleife ist die selbe(din = DataOutputStream):Link(Seite 18))
Ciao
DosCoder
 
Naja, wenn der Prozess gestartet wird, dann ist das ja quasi schon wie ein neuer Thread. Also das Programm läuft nach start() gleich weiter. Die readLine()-Methode hängt dann aber.

Das scheint aber auch von dem Programm abzuhängen, das gestartet wird.
Ich habe bspw Avidemux (Video-Schnittprogramm) gestartet und da tritt dieser Hänger auf.

Starte ich aber zB mplayer und spiele ein Video ab, dann funktioniert die Schleife einwandfrei.
 
Naja, wenn der Prozess gestartet wird, dann ist das ja quasi schon wie ein neuer Thread. Also das Programm läuft nach start() gleich weiter. Die readLine()-Methode hängt dann aber.

Das scheint aber auch von dem Programm abzuhängen, das gestartet wird.
Ich habe bspw Avidemux (Video-Schnittprogramm) gestartet und da tritt dieser Hänger auf.

Starte ich aber zB mplayer und spiele ein Video ab, dann funktioniert die Schleife einwandfrei.
Das hängt vermutlich einfach damit zusammen, dass mplayer auf der Standardausgabe ausgibt, während avidemux die Standardfehlerausgabe verwendet (die du ja noch nicht verarbeitest).

Schau mal hier: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

Gruß
 
Also bei mir gibt Avidemux eine ganze Menge auf StdOut aus.

Auf ErrOut erhalte ich
/dev/input/event0: Permission denied
/dev/input/event1: Permission denied
/dev/input/event2: Permission denied
/dev/input/event4: Permission denied
/dev/input/event6: Permission denied
/dev/input/event7: Permission denied

Und auf StdOut den ganzen Rest:
***************************
Avidemux v2.4.4
***************************
http://www.avidemux.org
.....

Da ich mittels ProcessBuilder.redirectErrorStream(true) den ErrOut und StdOut des aufgerufenen Programms zusammengelegt hatte, wurden mir die oben genannten Zeilen aus dem Error-Stream angezeigt.
Die Ausgabe erfolgte auch sofort; bei den StdOut-Ausgaben musste ich jedoch das Programm beenden und erst dann erschienen die Ausgaben.

Ich habe es testweise aber mal wie auf javaworld.com gezeigt gemacht. Also mit einer Klasse, die sich in je einem Thread um den jeweiligen Stream kümmert.
Dort habe ich genau das gleiche Problem.
Die Error-Ausgabe erfolgt sofort, auf die Standard-Ausgabe muss ich aber so lange warten, wie das Programm läuft.

Wie gesagt, bisher ist das bei mir nur bei Avidemux aufgetreten.
 

Neue Beiträge

Zurück