Veröffentlicht 15. August 200322 j 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....
15. August 200322 j 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
15. August 200322 j 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?
15. August 200322 j 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>
16. August 200322 j 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(); } } }
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.