process - getInputStream und getErrorStream zusammen legen

sign

Bekanntes Mitglied
Hallo, wie kann ich einen Process starten und die beiden stream zusammen legen. Hab da mal ein Beispiel gesehen, finds aber leider nicht mehr. :(

am liebsten über ProcessBuilder

Danke für Eure Hilfe.
lg
 

sign

Bekanntes Mitglied
[JAVA=42]
Process p = Runtime.getRuntime().exec("cmd /c" + com);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
[/code]
so bekomm ich den InputStream.
[JAVA=42]BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()))[/code]
so den ErrorStream.

Möchte nun beide zusammen legen und mit einer Schleife auslesen.
im Beispiel würden die beiden in der Zeile
[JAVA=42]BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()))[/code]
über eine Block mit {} Klammern zusammen gelegt. Aber ich weiß nicht mehr wie. :(
 
Zuletzt bearbeitet:

FArt

Top Contributor
Hm, Thread1 liest ERR, Thread2 liest OUT. Beide Threads schreiben in einen gemeinsamen OutputStream, der dann ausgelesen werden kann.
 

KrokoDiehl

Top Contributor
Schonmal FArts Idee mit deiner kombiniert? Java-seitig denke ich nicht, dass das geht, aber beim Aufruf des Prozesses könntest du beide Ströme umleiten, á la
Java:
Process p = Runtime.getRuntime().exec("cmd /c" + com + " 2>&1");
Dann müsstest du nur noch den InputStream von
Code:
p
auslesen.
 

AndiXng

Neues Mitglied
Ich hatte das selbe Symptom wie hier beschrieben. Bei mir lag der Fehler an der Übergabe der Dateinamen: Zuerst hab ich die Pfade durch Anführungszeichen eingeschlossen, um mit Leerzeichen umgehen zu können. Das mochte LAME aber nicht annehmen (seltsam, genau der gleiche exec-String geht, wenn man ihn in der Konsole eingibt). Ohne Anführungszeichen gings, aber dann natürlich nicht mehr mit Leerzeichen im Pfad... Die Lösung brachte bei mir der ProcessBuilder:

Java:
Process process = new ProcessBuilder("lame", inFile, outFile).start();
process.waitFor();
int exitValue = process.exitValue();
if (exitValue != 0)
	throw new IOException("LAME process returned: " + exitValue);
 
Zuletzt bearbeitet:

nrg

Top Contributor
also ich habe mir da immer eine kleine Hilfsfunktion geschrieben. Z.B. wenn es geloggt werden sollte (log4j):

Java:
	/**
	 * Loggt einen Stream
	 * @param is Der Stream
	 * @param level Das Loglevel
	 */
	private static void logStream(InputStream is, Level level) {
		Scanner scn = new Scanner(is);
		while (scn.hasNextLine()) {
			String line = scn.nextLine();
			if (!line.isEmpty()) logger.log(level, line);
		}
		scn.close();
	}

und dann eben 2 Aufrufe:

Java:
		logStream(pro.getInputStream(), Level.DEBUG);
		logStream(pro.getErrorStream(), Level.ERROR);
 

HoaX

Top Contributor
@nrg: Hoffentlich macht das Programm nicht zuviele Ausgaben auf stderr, sonst blockierts bei dir nämlich. Richtig wäre stdout und stderr gleichzeitig zu lesen, nicht nacheinander.
 

Ähnliche Java Themen

Neue Themen


Oben