2017-06-13 2 views
2

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.

+2

Fügen Sie '$ stdout.sync = true' zu ​​Ihrem Ruby-Skript hinzu. –

+0

@SotiriosDelimanolis Das war es. Ich danke dir sehr. Ich wusste, dass es so etwas sein musste. – cilki

Antwort

-1

Haben Sie Thread.sleep (1000) nach System.out.println() versucht. Sie müssen einige InterruptedException abfangen. Dein Redakteur wird es dir sicher sagen.

+0

Der Schlaf für eine Sekunde ist nur ein Beispiel. Ich hätte eigentlich eine Aufgabe, die eine unbekannte Zeit benötigt. – cilki

+0

Ok, dann ist das nicht möglich. Eine Idee ist es, ein Trennzeichen in Ruby zu setzen, auf das der Java-Inputstream wartet. Aber das wird nicht so einfach sein. Denken Sie daran, es ist nur ein Stream in Java. Dieser Stream kann nicht wissen, was als nächstes kommt, also solltest du ihm einige Flags geben. – atmin

Verwandte Themen