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
 

messi

Bekanntes Mitglied
Also, im Source (1.4 & 1.5) von java.lang.UNIXProcess werden die drei Streams in Buffered{In|Out}putStreams gepackt.
 

Mag1c

Top Contributor
Yep, i know,

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

Gruß
Mag1c
 

Murray

Top Contributor
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.
 

Mag1c

Top Contributor
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
 
G

Guest

Gast
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.
 

Mag1c

Top Contributor
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
 
G

Gast

Gast
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.
 

thE_29

Top Contributor
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
 

Mag1c

Top Contributor
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
 

thE_29

Top Contributor
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...
 

Mag1c

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Process.getInputStream unter Linux Allgemeine Java-Themen 7
G ungepufferter Process.getInputStream Allgemeine Java-Themen 10
J process.getInputStream() hängt auf merkwürdige Art und Weise Allgemeine Java-Themen 7
D Compiler-Fehler child process exited with code 1 Allgemeine Java-Themen 1
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
P Herausfinden, ob ein Process ein Fenster hat Allgemeine Java-Themen 1
D Java Process OutputStream ist null Allgemeine Java-Themen 4
X Problem bei process.start() ExitValue Allgemeine Java-Themen 5
T Mit Java auf die Konsole eines Process-Objekts zugreifen Allgemeine Java-Themen 10
P Input/Output Process.getErrorStream = OutputStream Allgemeine Java-Themen 11
J Download: Filename + Process waitFor() Allgemeine Java-Themen 5
S Wie beendet man einen Process in Java Platform unabhänging? Allgemeine Java-Themen 8
M Process wird gestoppt und nach beenden der Anwendung fortgeführt Allgemeine Java-Themen 4
G Process.destory() == CTRL+C Allgemeine Java-Themen 2
P Swing GUI Process anzeigen Allgemeine Java-Themen 10
schlingel Process - Ausgabe leer Allgemeine Java-Themen 5
J Process beenden ...aber wie ? Allgemeine Java-Themen 19
G Process - mehrere Commands?! Allgemeine Java-Themen 2
MQue auf gestarteten Process warten Allgemeine Java-Themen 7
G Process.wait() auf Folgeprozesse mitwarten Allgemeine Java-Themen 29
P Bedeutung der Process.exitValue() Werte? Allgemeine Java-Themen 3
J Process auf Console anzeigen lassen. Allgemeine Java-Themen 5
S Process - Befehle senden Allgemeine Java-Themen 13
B Process Builder Allgemeine Java-Themen 10
D Thread & Process: Beenden einer Batch-Datei Allgemeine Java-Themen 8
D Fremdes Programm schließen (ohne process.destroy()) Allgemeine Java-Themen 8
S process.waitFor() endet mit -1 Allgemeine Java-Themen 3
A Runtime Process bricht nicht ab! Allgemeine Java-Themen 7
C Process output Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben