java Runtime-Prozess - prüfen, ob auf Eingabe gewartet wird

8

Ich möchte einen Prozess mit Java Runtime erstellen: beispielsweise. Prozess proc = Runtime.getRuntime (). Exec ("cmd");

Dann möchte ich irgendwie auf den Prozess warten, bis er in den "Bereit für Eingabe" -Zustand ist, der verifizieren wird, dass er seine ganze Arbeit beendet hat. Anyway auf wie es geht?

Eine Sache, die möglich ist, ist "--- ended ---" zu wiederholen und zu prüfen, ob diese Zeile mit der stdin des Prozesses geschrieben wurde. Aber ich mag die Idee nicht.

Gibt es einen besseren (formellen) Ansatz dafür?

Übrigens, ich brauche diesen Effekt, wie ich es beschrieben habe. Ich möchte warten, bevor ich neue Befehle in die Batch-Datei schreiben kann.

Danke.

    
ComputeALot 28.04.2011, 23:07
quelle

3 Antworten

6

Hier sind ein paar Ideen. Sie hängen davon ab, ob das Programm, das Sie ausführen, das Lesen und Schreiben von stdin und stdout erwartet.

Nach dem Start des Prozesses müssen Sie nicht auf den Status "Bereit für Eingabe" warten. Wenn Sie Befehle senden müssen, verwenden Sie getOutputStream und schreiben Sie sie. Wenn das andere Programm immer noch bereit ist, werden die Daten, die Sie geschrieben haben, in einem Puffer gespeichert, bis das Programm von stdin liest.

Mit ProcessBuilder können Sie Argumente einfach steuern und Umgebung. Beispiel direkt von JavaDocs:

%Vor%

Dann, um zu lesen oder zu schreiben:

%Vor%     
Jonathon Faust 28.04.2011 23:19
quelle
6
  

Gibt es einen besseren (formellen) Ansatz dafür?

Nein. Java bietet keine Möglichkeit festzustellen, ob ein anderes Programm auf Eingabe wartet. In der Tat glaube ich nicht, dass dies überhaupt möglich ist (für Linux / UNIX), ohne im Kernel-Speicher herumzugrasen. (Und das wäre eine wirklich schlechte Idee ... IMO).

Am besten ist es, die Ausgabe des externen Programms auf Text zu prüfen, der anzeigt, dass ein Batch gerade beendet wurde ... und hoffen, dass Sie keinen falschen positiven Wert erhalten. (Oder stellen Sie die Stapel einfach in die Warteschlange, ohne zu warten, bis sie abgeschlossen sind. Das klingt jedoch nicht nach einer Lösung für Sie.)

    
Stephen C 28.04.2011 23:15
quelle
3

Ihre Frage scheint eine wirklich komplizierte Methode zu sein, um das endgültige Ergebnis zu erhalten.

Erstens hat Java die Fähigkeit, in beliebige Dateien zu schreiben. Warum nicht diese Fähigkeit in einem einzigen Thread verwenden? Calling Flush stellt sicher, dass der Schreibvorgang tatsächlich ausgeführt wird ...

Wenn Sie aus irgendeinem Grund wirklich Parallelität benötigen, verwenden Sie einen Thread über einen Prozess. Machen Sie den Thread dann zu dem, was er tun muss, und nicht mehr. Haben Sie den übergeordneten Thread join() den untergeordneten Thread. Wenn der untergeordnete Thread beendet ist, wird der übergeordnete Thread fortgesetzt.

Schließlich kann der Aufruf von available() für den Ausgabestream oder den Eingabestream angeben, dass Sie viele Daten haben, die Java vor dem Blockieren lesen kann. Dies ist nicht das, was Sie genau wollen, aber kann an die Arbeit angepasst werden, die ich rate.

    
Jerome 28.04.2011 23:21
quelle

Tags und Links