Ausgabe eines mit Runtime.exec() gespawnten Prozesses tunneln

poseidonTU

Grünschnabel
Ich habe folgendes Problem: Ich starte unter Windows eine .exe die ein pdf drucken soll mittels Runtime.exec(). Zum Auslesen der stdOut und stdErr Streams verwende ich zwei Threads, in deren Runnable.run() ich folgendes mache:

Java:
// is ist der stdOut/stdErr Stream des child prozesses

InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ((line = br.readLine()) != null)
{
	System.out.println(">>>" + line);
}

Mein Problem ist nun, dass die genannte .exe teilweise recht lange läuft und dabei ständig Output produziert ("Printing page XX " usw). Diese Zeilen kommen, wenn ich die .exe manuell ausführe in regelmäßigen Abständen (etwa 5-6/Sekunde). Wenn ich die .exe aber von Java aus starte erhalte ich den gesamten Output erst wenn die .exe terminiert hat. Solange die .exe noch läuft blockiert der allererste Aufruf der br.readLine() Methode.

Gibt es irgendeine Möglichkeit den Output instant weiterzugeben? Oder ist das irgendein Problem dieser .exe?

mfg poseidon
 
Zuletzt bearbeitet:
Das ist komisch. Ich habe sowas schon öfters programmiert und noch nie ein solches Problem gehabt.

Probier mal das hier:

Code:
import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class ExecTest {
	public static void main(String[] args) throws IOException,
			InterruptedException {
		ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "dir");
		builder.directory(new File("c:/"));
		final Process p = builder.start();

		new Thread(new Runnable() {

			public void run() {
				Scanner s = new Scanner(p.getInputStream()).useDelimiter("\\n");
				while (s.hasNext()) {
					System.out.print(s.next());
				}
			}

		}).start();

		System.out.println("Returncode: " + p.waitFor());
	}
}

Gruß
Flo
 
Den error stream kannst du natürlich auch noch redirecten, dann brauchst du nicht 2 Scannerthreads.

builder.redirectErrorStream(true);

Gruß
Flo
 
Ich habe mal noch schnell deinen Codeschnippsel getestet. Der läuft bei mir, d.h. er gibt den Input des Processes sofort Zeilenweise aus.

--> Der Fehler ist entweder woanders im Code oder in der exe. Um das zu testen, müsstest du beides hier rein posten.

Gruß
Flo
 
Zurück