Hi!
Wollte nur noch mal sicher gehen, daß das, was ich vorhabe, auch wirklich nicht in Java funktioniert.
Ich möchte gerne eine Art grafische Konsole/Terminal haben, das in Java geschrieben ist.
Dafür eignet sich eigentlich dieses hier
Process p = Runtime.getRuntime().exec("java TestPrints");
Die Zeile führt dann somit das Java-Programm TestPrints aus gibt die Ausgaben des Programms an den Process p.
Ein
int data = input.read();
while (data != -1) {
char cdata;
cdata = (char) data;
System.out.print(cdata);
data = input.read();
}
input.close();
gibt dann auch aus, was es von dem Programm “TestPrints” empfangen hat.
Nun gibt es aber direkt drei Streams von Process. Und genau das ist das Problem.
Obiges funktioniert nur für die Standardausgabe. Die Fehlerausgabe, liest man mit dem ErrorStream ein:
int data = error.read();
while (data != -1) {
char cdata;
cdata = (char) data;
System.out.print(cdata);
data = error.read();
}
error.close();
Angenommen das auszuführende Programm TestPrints.java sieht folgendermaßen aus (zu beachten, daß ich manchmal System.out,println() und manchmal System.err,println() geschrieben habe):
public static void main(String[] args) {
System.out.println("normal");
System.err.println("error");
System.out.println("wieder normal");
System.err.println("wieder error");
System.out.println("eins");
System.out.println("zwei");
System.out.println("dreimal normal");
System.err.println("1");
System.err.println("2");
System.err.println("3");
System.err.println("4 x error");
System.out.println("und wieder normal");
System.out.print("Dieses ");
System.err.print("ist ");
System.out.print("nun ");
System.out.print("ein ");
System.out.print("ge");
System.err.print("mischter ");
System.err.println("Text");
System.out.print("Mal sehen,");
System.err.print(" ob ");
System.err.print("es");
System.out.println(" funktioniert");
}
}
Dann wird es in einer normalen Konsole/Terminal alles nacheinander genau so ausgegeben.
Bei Process habe ich jedoch zwei verschiedene Streams, die jeweils irgendwann ankommen und sich nicht an die ursprüngliche Reihenfolge halten.
Noch schlimmer wird es, wenn man den OutputStream hinzunimmt. Angenommen das aufgerufene Programm TestPrints.java sieht so aus
public class TestPrints {
public static void main(String[] args) {
System.out.print("Wie heißt Du? ");
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
System.out.println("Hallo " + s + ", schoen Dich getroffen zu haben.");
}
}
Dann kann es sein, daß die Tastatureingabe-Abfrage vor der Frage erscheint, auf die man antworten soll.
Grüße
theuserbl
*** Edit ***
Nachtrag: Obiges, daß sie Reihenfolge willkürlich ist, bezieht sich darauf, wenn ich die drei Streams in drei verschiedenen Threads laufen lasse.
Wenn alle im selben Thread sind, dann gebe ich mal die komplette Standardausgabe aus, dann die Fehlerausgabe und dann kommt die komplette Tastaturabfrage.
Letztendlich ist das dann genauso schlecht.
Das Problem bleiben halt die drei unabhängigen Streams.
Grüße
theuserbl