lesen und schreiben aus Programm

Status
Nicht offen für weitere Antworten.

michaelw

Mitglied
Hallo!

Ich versuche gerade einen JAVA-Wrapper zu schreiben, der sowohl Daten aus einem interaktiven Programm liest und auch Daten in dasselbe Programm schreibt. Das interaktive Program ist in Perl geschrieben und wenn ich es manuell benutze, gibt es keine Probleme. Der relevante Teil meines Java Programms sieht wie folgt aus:

Code:
private OutputStreamWriter outstream;
private BufferedReader instream;

Process process = Runtime.getRuntime().exec("perl " +
"/workspace/trec-qa-2006/ext/WordNetSimilarity/WordNet-Similarity-1.03/utils/similarity.pl " +
"--type=WordNet::Similarity::wup --interact");

outstream = new OutputStreamWriter(process.getOutputStream());
instream = new BufferedReader(new InputStreamReader(process.getInputStream()));
outstream.write("eat\n");
outstream.write("feed\n");
outstream.flush();

String line = null;
while((line=instream.readLine()) != null){
System.out.println("Line: " + line);
}

Das Problem ist, dass das Programm endlos lang läuft, aber nichts ausgibt.
Ich vermute, dass diese Probleme dadurch entstehen, dass das Perl-Programm ein paar
Sekunden zum Laden braucht. Deshalb wollte ich mithilfe von "process.wait()" den Thread für ein paar Sekunden warten lassen, also


Code:
 try {
               process.wait(7000);
         } catch (InterruptedException e1) {
                e1.printStackTrace();
        }

Dadurch bekomme ich aber die folgende Fehlermeldung:

Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at compare.Processor.<init>(Processor.java:50)
at compare.Processor.main(Processor.java:129)

mit der ich nichts anfangen kann. Kann mir jemand sagen, wie ich diesen Fehler beheben kann?
Vielleicht ist die "wait()" Operation ja auch nicht die Lösung für das eigentliche Problem.
Komisch ist nur, dass wenn ich das gleiche Verfahren (ohne wait()) auf ein anderes interaktives Programm
anwende (ich habe es mit dem Ruby-Interpreter "irb" versucht), das Schreiben und Lesen aus dem Programm völlig problemlos funktioniert.


Vielen Dank im Voraus!
 
Über:
Code:
try
{
    Thread.sleep(7000); //7 sec warten
}catch(InterruptedException ex)
{
    ex.printStackTrace();
}

wartest du 7 Sekunden.
 
Ich habe den Code bei mir eingefügt, aber leider hat es nichts gebracht. Ich habe auch im entsprechenden Perl-Code geprüft, dass der gesamte Output nach STDOUT geschickt wird, aber das war alles so wie es sein sollte.
 
Probier mal anstatt

Code:
instream = new BufferedReader(new InputStreamReader(process.getInputStream()));

Code:
instream = new BufferedReader(new InputStreamReader(process.getErrorStream()));

Das hat mir mal geholfen, weil die Ausgabe über den Error-Stream kam..
 
Nein, das Programm bricht nicht mehr ab, es läuft endlos weiter und gibt nichts aus, was mich wundert, da doch etwas nach STDOUT geschrieben wird (laut Perl-code).
 
Ergänzung zu meinem letzten Eintrag;
Ich habe im Perl Code die "STDERR prints" auf STDOUT umgesetzt, so dass alles, was kommt, in STDOUT geschrieben wird.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben