Znoob Geschrieben 15. August 2003 Geschrieben 15. August 2003 Moin... ...hab folgendes Problem.... Ein Java-Programm, das normal über die UNIX-Eingabeaufforderung gestartet wird, startet immer wieder ein neues Java-Programm. Das Problem ergibt sich dann, wenn in dem neu gestarteten Programm Konsolenausgaben auftreten, diese Programme sich einfach aufhängen und die Verarbeitung einstellen. Hat von euch jemand schon ähnliche Erfahrungen gemacht? Meine Vermutung ist die, da die neuen Java-Programmen ja nicht innerhalb einer neuen Konsole gestartet werden, das Programm nicht weiß, wohin die Ausgaben gesendet werden sollen.... Eine Lösungsmöglichkeit wäre vielleicht, alle Konsolenausgaben in eine Datei um zu leiten, aber wie das funktioniert habe ich noch nicht rausgefunden.... Zitieren
themaster Geschrieben 15. August 2003 Geschrieben 15. August 2003 Ich gehe davon aus dass du das anderen Programm mit Runtime.exec() aufgerufen hast. Dort gibt es die methode getInputStream unt getErrorStream. Diese kannst du in eine Datei leiten oder an out/error der System-Klasse leiten, dann werden Sie auf der Konsole ausgegeben Zitieren
Znoob Geschrieben 15. August 2003 Autor Geschrieben 15. August 2003 Das hab ich schon probiert, aber nicht hinbekommen.... Process pr = Runtime.getRuntime().exec(javahome + "java -classpath " + classPath + " " + klasse); InputStream is = pr.getInputStream(); System.out.write(is.read()); InputStream es = pr.getErrorStream(); System.out.write(es.read()); Wie muss ich mir das sonst vorstellen? Zitieren
themaster Geschrieben 15. August 2003 Geschrieben 15. August 2003 Ich wurde nicht byte für byte auslesen, sondern mit available testen wieviele Zeichen verfügbar sind und dann mit der read(byte[] array)-Methode mehr auf einmal lesen. Ansonsten sieht es eigentlich ok aus. Kann mir so eigentlich nicht vorstellen, warum das Programm abstürzen sollte. <edit> Liegt es vielleicht daran, dass du sowieso nur 1 Byte ausliest und dann nie wieder aus dem Inputstream liest. Dann gibt du auch nru 1 Byte auf der Konsole aus und danach wie wieder etwas. </edit> Zitieren
PerdianMG Geschrieben 16. August 2003 Geschrieben 16. August 2003 Dein Problem liegt am Prinzip eines InputStream. Wenn keine Daten mehr vorhanden sind, wir solange geblockt, bis wieder etwas da ist. Zu deinem Beispiel: 01 Process pr = Runtime.getRuntime().exec(javahome + "java -classpath " + classPath + " " + klasse); 02 03 InputStream is = pr.getInputStream(); 04 System.out.write(is.read()); 05 InputStream es = pr.getErrorStream(); 06 System.out.write(es.read()); Erstmal wird überhaupt nichts passieren, bis du in Zeile 03 aus dem InputStream Daten erhälst. Hiervon gibst du dann ein einziges Byte aus (das erste halt) und danach machst du mit dem InputStream überhaupt nichts mehr. Danach geht dasgleiche mit dem ErrorStream nochmal von vorne los - du wirst also maximal zwei Bytes auf der Console ausgeben können und das wars. Die Lösung für dein Programm sind zwei Threads, die die Daten der Streams auffangen und auf die Console weitergeben: Alles ungetestet, aber sollte eigentlich funktionieren :-) Ciao Christian public class TestClass { public static void main(String[] args) { Process pr = Runtime.getRuntime().exec(javahome + "java -classpath " + classPath + " " + klasse); InputStream inStream = pr.getInputStream(); InputStream errorStrean = pr.getErrorStream(); StreamRelayThread inRelay = new StreamRelayThread(inStream, System.out); StreamRelayThread errorRelay = new StreamRelayThread(errorStream, System.err); inRelay.start(); errorRelay.start(); inRelay.join(); errorRelay.join(); } } public class StreamRelayThread extends Thread { private InputStream myInStream = null; private OutputStream myOutStream = null; public StreamRelayThread(InputStream inStream, OutputStream outStream) { this.myInStream = inStream; this.myOutStream = outStream; } public void run() { try { for(int data = this.myInStream.read(); data > -1; data = this.myInStream.read()) { this.myOutStream.write(data); } } catch(IOException e) { e.printStackTrace(); } } } Zitieren
Znoob Geschrieben 12. September 2003 Autor Geschrieben 12. September 2003 Danke! Das bringt mich schonmal ne ganze Ecke weiter! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.