2017-06-13 3 views
2

次のコードでJavaからスクリプトを実行しています。Runtime.getRuntime()。exec()から一度にすべてではなく行ごとにSTDOUTを取得

test.rbが単純である
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); 
     } 
    } 

puts "one" 
sleep 1 
puts "two" 

問題は、すべての入力が同時にBufferedReaderに到着したということです。 2本の線の間に1秒の遅延があるはずです。スクリプトのすべての行の後にInputstreamをフラッシュする方法はありますか?私はJavaのGUIから、いくつかのRubyスクリプトを呼び出すと、スクリプトの出力を持ちたい
を達成しようとしている何

はtextpaneにインクリメンタルに表示されます。上記のコードを使用すると、スクリプトのSTDOUTは、スクリプトが終了したとき(そしてInputstreamがおそらくフラッシュされているとき)、一度にテキストペインに表示されます。

編集:
問題は、RubyがSTDOUTをバッファしていたことでした。 $stdout.sync = trueで修正。

+2

ルビスクリプトに '$ stdout.sync = true'を追加します。 –

+0

@SotiriosDelimanolisそれはそれでした。どうもありがとうございます。私はそれがこのようなものでなければならないことを知っていた。 – cilki

答えて

-1

System.out.println()の後にThread.sleep(1000)を試しましたか? InterruptedExceptionを捕まえる必要があります。あなたのエディタがあなたに確かに教えてくれるでしょう。

+0

1秒間の睡眠は単なる例です。私は実際には時間のいくつかの未知の量を取るタスクを持っています。 – cilki

+0

それでは、それはできません。 1つのアイデアは、Java入力ストリームがルビに区切り文字を置くことです。しかし、それは簡単ではありません。これはJavaのストリームだと覚えておいてください。このストリームは次に何が来るのか分からないので、いくつかのフラグを付けるべきです。 – atmin

関連する問題