Ich führe ein Skript aus Java mit dem folgenden Code.Erhalten Sie STDOUT von Runtime.getRuntime(). Exec() Zeile für Zeile und nicht auf einmal
try (BufferedReader input = new BufferedReader(new InputStreamReader(Runtime.getRuntime()
.exec("ruby test.rb").getInputStream()))) {
String line = null;
while ((line = input.readLine()) != null) {
System.out.println("Got line: " + line);
}
}
Wo test.rb
einfach ist:
puts "one"
sleep 1
puts "two"
Das Problem ist, dass alle von der Eingabe in den BufferedReader
zugleich ankommen. Zwischen den beiden Zeilen sollte eine Verzögerung von 1 Sekunde liegen. Gibt es eine Möglichkeit, die Inputstream
nach jeder Zeile im Skript zu spülen?
Was ich versuche
Ich möchte zu erreichen einige Ruby-Skripte aus einer Java-GUI aufrufen und die Ausgabe des Skripts haben schrittweise in einem TextPane auftauchen. Mit dem obigen Code wird STDOUT aus dem Skript auf einmal in der Textfläche angezeigt, wenn das Skript beendet wird (und die Inputstream
wird vermutlich geleert).
Bearbeiten:
Das Problem war, dass Ruby STDOUT puffern. Behoben von $stdout.sync = true
.
Fügen Sie '$ stdout.sync = true' zu Ihrem Ruby-Skript hinzu. –
@SotiriosDelimanolis Das war es. Ich danke dir sehr. Ich wusste, dass es so etwas sein musste. – cilki