Process -> getInputStream -> nur gepuffert ?

Status
Nicht offen für weitere Antworten.

Mag1c

Top Contributor
Hi Leutz,

meine erste Frage hier :bae:

ich starte ein externes Programm mit Runtime.exec(...) und lese dessen Ausgabe über getInputStream() -> InputStreamReader -> BufferedReader -> readLine.
Der verdammte Mist kommt nun nicht zeilenweise sondern nur in größeren Blöcken .... d.h. da wird irgendwo gepuffert. Ich will aber jede Zeile sofort haben, wenn sie vom externen Programm ausgegeben wird. In der Konsole klappt das doch auch !? Hat sich schon mal jemand mit so einem Problem rumgeärgert und evtl. eine Lösung parat. Bei Google hab ich ne Diskussion zu diesem Thema aus dem Jahre 2004 gefunden aber leider ohne Lösung 🙁

viele Grüße
Mag1c
 
Also, im Source (1.4 & 1.5) von java.lang.UNIXProcess werden die drei Streams in Buffered{In|Out}putStreams gepackt.
 
Yep, i know,

das heißt aber nicht automatisch, daß ich meinen Input nur noch blockweise abholen darf.

Gruß
Mag1c
 
Und wenn Du auf den Buffered-Reader verzichtest? Dann kannst Du zwar nicht so komfortabel zeilenweise lesen, fängst Dir aber keinen zusätzlichen Buffer ein.
 
Ja,

ich hab schon probiert, direkt dem InputStream per read und einem kleinen Puffer ein paar Bytes zu entlocken -> kein Erfolg, gleiches Resultat 🙁

Gruß
Mag1c
 
Ich hab das bei mir so geloest:
Code:
InputStream inputStream = process.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
InputStream errorStream = process.getErrorStream();
BufferedInputStream bufferedErrorStream = new BufferedInputStream(errorStream);

dann in einer while schleife (wo immer der prozessstatus ueberwacht wird):

Code:
while (bufferedInputStream.available() > 0 || bufferedErrorStream.available() > 0) {
	while (bufferedInputStream.available() > 0) {
		output = (char) bufferedInputStream.read();
		System.out.print(output);
		if (monitorProcess()) {
			process.destroy();
			return false;
		}
	}
	while (bufferedErrorStream.available() > 0) {
		output = (char) bufferedErrorStream.read();
		System.out.print(output);
		if (monitorProcess()) {
			process.destroy();
			return false;
		}
	}
}

Bei monitorProcess() ueberpruefe ich dann z.B. die Ausgaben, um bei bestimmten Dingen den Prozess abzubrechen. Vielleicht hilft dir das was - die Ausgabe erfolgt bei mir zeichenweise, allerdings kann man ja das Zeichen fuer Zeilenumbruch abfragen.

Schicke dir auch gerne meinen vollstaendigen Code, falls noetig, der ist aber im Moment noch sehr unleserlich.
 
Hi,

danke erstmal ... hilft aber auch nicht weiter ... 🙁 ... ich leg das erstmal auf Eis.

PS: Hab ich schon erwähnt, daß ich das alles unter Linux mache ? Vielleicht ist hier ja noch irgendwas Buggy.

Gruß
Mag1c
 
Ich mache auch alles unter Linux und bei mir gehts - was genau willst du machen? Umleitung der Prozessausgabe auf System.out - wie gesagt: Bei mir funktioniert es unter Ubuntu.

Die ausgabe in der Kommandozeile sieht übrigens etwas anders aus, als die Eclipse-interne.
 
Laut Java/Sun selbst spinnen die Process Streams...

Irgendwann wenn sie zuviele Daten erhalten, hängen sich diese auf und bringen nichts mehr zurück....

Hab das schon paar mal gehabt.. Hab dann einfach den Prozessaufruf umleiten lassen in eine Date 🙂 und diese ausgelesen ^^

Also bla.sh > /tmp/bla.tmp

Und wenn man alles will

bla.sh > /tmp/bla.tmp 2>&1
 
Ah ja,

genau den Eindruck habe ich auch. Hast du irgend welche Quellen (bei Sun o.a.), wo darüber etwas geschrieben steht ?

Gruß
Mag1c
 
Bin irgendwann mal über einen Bug Report von Sun gestoßen, wo man das auch erklärt hat... Bzw, als Bug abgestempelt hat...

Frag mich aber nima wo...
 
Moin,

UPDATE: hmm, scheinbar hat Java keine Schuld an meinem Problem sondern das externe Tool, was ich da aufrufe. Offensichtlich wird dort die Ausgabe gepuffert 🙁 Ich habe nun das Tool modifiziert, so daß jede Ausgabe gleich "geflushed" wird ... und siehe da ... es kommt auch sofort in meinem Java-Programm an 🙂

EDIT: Nagut, Haken dran 😉

Gruß
Mag1c
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben