Input/Output Process.getErrorStream = OutputStream

Hi miteinander,

Ich beschäftige mich gerade mit Input/Output-Streaming und wenn ich von einem mit dem folgendem Code gestartetedem Process:
Java:
Process p = Runtime.getRuntime().exec("java test.jar");
den OutputStream haben will, dann muss ich ja
Java:
p.getInputStream();
verwenden (Dann sollte das ausgegeben werden was das ausgeführte Programm mit "System.out.println("");" ausgibt).

Jetzt habe ich das mal gemacht, es funktioniert aber nicht. Dann habe ich das mal auf getErrorStream(); umgeändert und es funktionierte...

Weiß jemand warum das so ist?

Gruß PNGamingPower
 
Ich behaupte mal, der gestartete Prozess hat in die Fehlerausgabe geschrieben. 😉 Kann es sein, dass du Fehlermeldungen (Exceptions etc.) abfangen willst?

Ark
 
Ja, unter anderem, da ich ein Log-Panel mit verschiedenen TextAreas machen möchte um eben die rauszufiltern. Jedoch weiß ich, dass diese Ausgaben mit System.out im Sub-Program gemacht worden sind.
 
Tja, dann hilft wohl nur mit 2 Threads sowohl Input als auch Error zu lesen wenn du nicht genau weißt wo was hingeschrieben wird (Throwable.printStackTrace() z.b. schreibt IMMER in ERROR).
 
Okay, mal anders gefragt: Was willst du denn damit bezwecken? Was soll am Ende rauskommen?

Was Umleitungen von sysin/sysout/syserr angeht, ist man mit brauchbaren Shells wesentlich besser bedient als etwa bei Windows. Keine Ahnung, wie man bei Letzterem z.B. syserr in sysout umleitet.

Ark
 
Zuletzt bearbeitet:
Ich möchte gerne eine GUI für ein Java Programm machen. Da werden dann verschieden Logfenster sein. Jetzt wollte ich nunmal den ErrorStream lesen um dann das in den ErrorLog zu schreiben. Das selbe mit dem OutputStream in den normalen Log. Natürlich vom Subprogramm.

Gelöst habe ich das nun schon, nur würde mich interessieren, wie etwas was durch System.out ausgegeben wird im getErrorStream zu suchen hat...
 
könntest du dein test.jar als Quellcode und das Ausleseprogramm zur Verfügung stellen?
vielleicht erkennt man etwas, was sich rein aus der logischen Bearbeitung im Kopf nicht ergibt
 
Weil im Code des ausgeführten Programms "System.out" steht 🙂

Hier ist der Code:
Java:
try {
	p = Runtime.getRuntime().exec("java -jar test.jar");
} catch (IOException e) {
	e.printStackTrace();
}

try {
	out = new BufferedReader(new InputStreamReader(p.getInputStream(), "UTF-8"));
	err = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8"));
} catch (UnsupportedEncodingException e) {
	e.printStackTrace();
}
Executors.newSingleThreadExecutor().execute(new Runnable() {
	@Override
	public void run() {
		try {
			while ((s = out.readLine()) != null) {
				s = s.replace(">", "");
				if (s == "" || s == " ")
					return;
				if (s.length() > 0) {
					System.out.println("INFO: " + s);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
});

Executors.newSingleThreadExecutor().execute(new Runnable() {
	@Override
	public void run() {
		try {
			while ((s = err.readLine()) != null) {
				s = s.replace(">", "");
				if (s == "" || s == " ")
					return;
				if (s.length() > 0) {
					System.out.println("ERR: " + s);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
});

Habe jedoch mal ein eigenes Program getestet und bin draufgekommen, dass dass wohl an der auszuführenden Datei liegen muss, da beim System.out.println(); das Zeug auch aus dem richtige Stream. Ich schau mir mal den Code an. (Es handelt sich um die CraftBukkit.jar, falls ihr das testen möchtet: hier). Da werden nämlich Plugins geladen und in einem Plugin von mir, mit diesem Code etwas ausgegeben:
Java:
System.out.println("[BukkitControllerPlugin] BufferedReader has been enabled!");
und so empfängt es mein Program:
Code:
ERR: 18:30:59 [INFORMATION] [BukkitControllerPlugin] BufferedReader has been enabled!
 
Zuletzt bearbeitet:
Mal nur so ganz nebenbei als Tipp und auch in Anlehnung daran : http://www.java-forum.org/forum-faq-beitraege/7407-man-fragen-richtig-stellt.html

Die Info das es sich um Bukkit handelt hätte in deinen ersten Post gehört !

Dessweiteren gehört die Frage warum die Log-Ausgaben von Bukkit über den Error-Stream kommen eher ins Bukkit-Forum als hier ins Java-Forum, denn alles was wir dir hier sagen können ist :

1) Im Normalfall ist System.out dann auch mit Process.getInputStream und System.err mit Process.getErrorStream verbunden. Wenn innerhalb von Bukkit hier etwas dran gedreht wird ala System.out wird sonstwohin umgeleitet dann kann das hier niemand wissen. Vor allem dann nicht wenn du uns nicht mal sagst das es um Bukkit geht. (Persönlich gehe ich mal davon aus das ALLES zum Logger (Log4J) umgeleitet und dann letztendlich über ERR rausgeschrieben wird. Grund : auch Ausgaben über OUT sollen im Log stehen.)

2) Das es auch vom verwendeten OS abhängt ob es überhaupt einen Unterschied zwischen OUT und ERR gibt oder nicht. Unter Unix kann man sich da ziemlich sicher sein, aber unter Windows eher weniger. Das was viele als "DOS" beziechnen ist lediglich ein sog. "Befehlszeileinterpreter" der selbst NICHT den Unterschied zwischen OUT und ERR kennt wesshalb es auch keine gesonderten Pipes gibt wie unter Unix üblich. Windows selbst kennt diesen Unterschied zwar, aber es wird denke ich mal schon irgendwo Sinn machen sich für sowas von CMD.exe zu lösen. In wie weit es hier genaue Spezifikationen gibt ist im MSDN nachlesbar.


Da du selbst von einem Test sprichst bei dem eben das erwartete Verhalten eintritt, nämlich das das was du in OUT schreibst auch über InputStream ankommt sollte einem klar sein das wenn es bei einer fremden API eben nicht so ist das dort intern irgenwo OUT auf ERR umgeleitet wird und NICHT an einem Bug oder Fehler in Java selbst liegt. Das sind Grundlagen des Multi-Processing und sollte man Wissen wenn man sowas vorhat wie du.
 
@J7DEV

Danke für den Link.

Werde diese Tipps nun beachten. Hätte gesagt zuerst ein paar Tests machen sollen, bevor ich das hier poste. Tut mir leid...

Jedoch hast du mir auch geholfen, da ich nicht daran gedacht habe, das Bukkit ja mit dem Logger arbeitet.

Ebenso Danke für 2) :toll:
Das wusste ich nicht.

Ich habe es nun gelöst und auch danke an die anderen Antwortgeber. :toll:

Gruß PNGamingPower
 

Neue Themen


Zurück
Oben