Hallo Zusammen.
Ich habe mir ein kleines Programm (Quellcode auszugsweise anbei) geschrieben, welches einen Prozess startet und dessen Ausgabe ausliest.
In der Klasse StreamTaker (im Konstruktor) wird der Prozess erzeugt und gestartet.
Nach dem der Prozess gestartet wurde -
-
wird dann mittels
die Runmethode der Klasse StreamTaker (die ja von
der Klasse Thread erbt) aufgerufen.
Zuerst soll eine mögliche Fehlermeldung aus dem ErrorStream gelsen werden und danach eine mögliche
MsgStream Meldung.
Wenn ich jetzt z.B. eine Batch Datei starte, die nur eine MsgNachricht enthält, dann bleibt das Programm an der Stelle tmp = br.readLine() hängen, ohne Exception, ohne tmp mit NULL zu belegen.
Wird jedoch eine ErrorMsg geschrieben, dann ist alles ok.
Das Programm hängt bei zwei Konstellationen:
Batch liefert Fehlermeldung --> Falls zuerst Zugriff auf MsgStream --> bleibt hängen
Batch liefert Msg --> Falls zuerst Zugriff auf ErrorStream --> bleibt hängen
Ändere ich jedoch den Quellcode so, daß ich bei einer Fehlermeldung zuerst auf den ErrorStream und dann auf den MsgStream zugreife, dann läuft es seltsamerweise normal durch ???:L
Ich habe mir ein kleines Programm (Quellcode auszugsweise anbei) geschrieben, welches einen Prozess startet und dessen Ausgabe ausliest.
In der Klasse StreamTaker (im Konstruktor) wird der Prozess erzeugt und gestartet.
Nach dem der Prozess gestartet wurde -
Java:
Process proc = rt.exec(cmd)
wird dann mittels
Java:
this.start()
der Klasse Thread erbt) aufgerufen.
Zuerst soll eine mögliche Fehlermeldung aus dem ErrorStream gelsen werden und danach eine mögliche
MsgStream Meldung.
Wenn ich jetzt z.B. eine Batch Datei starte, die nur eine MsgNachricht enthält, dann bleibt das Programm an der Stelle tmp = br.readLine() hängen, ohne Exception, ohne tmp mit NULL zu belegen.
Wird jedoch eine ErrorMsg geschrieben, dann ist alles ok.
Das Programm hängt bei zwei Konstellationen:
Batch liefert Fehlermeldung --> Falls zuerst Zugriff auf MsgStream --> bleibt hängen
Batch liefert Msg --> Falls zuerst Zugriff auf ErrorStream --> bleibt hängen
Ändere ich jedoch den Quellcode so, daß ich bei einer Fehlermeldung zuerst auf den ErrorStream und dann auf den MsgStream zugreife, dann läuft es seltsamerweise normal durch ???:L
Java:
public class StreamTaker extends Thread
{
private InputStream msgStream;
private InputStream errorStream;
private String errorText;
private String msgText;
public static void main (String [] args)
{
StreamTaker st = new StreamTaker(new File("./test.bat"));
System.out.println(st.getErrorText());
System.out.println(st.getMsgText());
}
public StreamTaker(File f)
{
try
{
String[] cmd = new String[3];
cmd[0] = "cmd.exe";
cmd[1] = "/C"; // Schließt die Konsole nach Beendigung
cmd[2] = f.getAbsolutePath();
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
this.errorStream = proc.getErrorStream();
this.msgStream = proc.getInputStream();
this.start(); // Mittels Thread die Infos aus der Konsole auslesen
this.errorValue = proc.waitFor();
}
catch (Throwable t)
{
t.printStackTrace();
}
}
@Override
public void run()
{
BufferedReader br = null;
String tmp = null;
try
{
br = new BufferedReader (new InputStreamReader(this.errorStream));
while ((tmp = br.readLine()) != null)
this.errorText = this.errorText + tmp + "\n";
br.close();
br = new BufferedReader(new InputStreamReader(this.msgStream));
tmp = null;
while ((tmp = br.readLine()) != null)
this.msgText = this.msgText + tmp + "\n";
br.close();
System.out.println("**");
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}