Java, Executables und deren Ergebnisse

Hallo zusammen,

ich habe ein Problem, bei dem ich mir nicht sicher bin, ob es wirklich direkt mit Java an sich zusammenhängt.

Ich habe eine .exe, die ich aus Java aufrufe. Die erzeugt eine .txt, in der sie ihre Ergebnisse speichert. Es funktioniert eigentlich auch alles. Wenn ich mein Java-Programm aus der Kommandozeile aufrufe, arbeitet das Teil, und das Ergebnis wird in der .txt gespeichert. Wenn ich das Java-Programm aber aus der Entwicklungsumgebung starte (inzwischen netbeans 4.0 - passiert aber auch im SunOneStudio), dann werden lediglich die ersten 4 Zeilen geschrieben.
Eigentlich hat das erzeugen der .txt ja nichts mit Java zu tun, aber kann es sein, dass meine Entwicklungsumgebung die .exe in ihrer Tätigkeit quasi abwürgt und einfach verhindert, dass die die Textdatei fertigschreibt?

Wie gesagt, eigentlich funktioniert alles, und die ersten von der .exe in die .txt geschriebenen 4 Zeilen sind auch korrekt. Ich finde das recht mysteriös…

Gruß
Schorsch

Moin

Das Problem mit dem Process Output- und Error-Stream kennst du ?

cu

Das Problem mit dem Process Output- und Error-Stream kennst du
?

Öhm - nein?

Falls das wichtig ist - ich rufe die .exe auf wie folgt:

try { Runtime.getRuntime().exec(" …*Dateipfad*… ");}
catch(IOException ioe){ …*Fehlermeldung schreiben*… }

Gruß
Schorsch

Moin

Öhm - nein?

Falls das wichtig ist - ich rufe die .exe auf wie folgt:

argh… Ganz grob:
Man muss den InputStream und ErrorStream immer wieder auslesen (per In.read()).

Alles was das Prog von sich gibt landet auf einem der 2 Streams. D.h. die Daten werden erstmal von OS in einen Buffer geschrieben. Später, wenn man in der JVM die Streams ausliest, werden die Daten aus dem Buffer gelöscht. Wenn der Buffer (windows: ±512 Byte) voll läuft, blockiert das OS das Program. Und dein Fall klingt doch nach blockiertem Program…

Deshalb jegt man 2 neue Threads an die einfach nur die Streams ad-inifitum auslesen. Also in etwa so:

public void run (){
 try {
 while (true){
 in.read();
 }
 } catch (Exception e){
 }
}

Ob’s das wirklich war weiss ich aber nicht. Du denkst dran dass die Arbeitsverzeichniss bei den IDE-aufrufen ein ganz anderes ist als das beim Aufrufen per Konsole ?

cu