2017-06-13 32 views
2

我使用以下代碼從Java執行腳本。從Runtime.getRuntime()。exec()逐行獲取STDOUT而不是所有的一次

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); 
     } 
    } 

哪裏test.rb很簡單:

puts "one" 
sleep 1 
puts "two" 

的問題是,所有的輸入同時到達的BufferedReader。兩條線之間應該有1秒的延遲。腳本中的每行之後是否有刷新Inputstream的方法?

我試圖完成
我想打電話從Java GUI一些Ruby腳本,並有腳本的輸出逐步顯示在一個textpane。使用上面的代碼,腳本中的STDOUT會在腳本終止時立即顯示在文本窗格中(並且可能會刷新Inputstream)。

編輯:
問題是Ruby緩衝STDOUT。通過$stdout.sync = true修復。

+2

將'$ stdout.sync = true'添加到您的ruby腳本中。 –

+0

@SotiriosDelimanolis就是這樣。非常感謝。我知道它必須是這樣的。 – cilki

回答

-1

您是否在System.out.println()後嘗試過Thread.sleep(1000)。你必須捕獲一些InterruptedException。你的編輯會肯定地告訴你。

+0

睡一秒鐘就是一個例子。我實際上有一項任務需要花費一些未知數量的時間。 – cilki

+0

好吧,那是不可能的。一個想法是將分隔符置於紅寶石中,Java輸入流正在等待。但那不會那麼容易。請記住它只是Java中的一個流。這個流無法知道接下來會發生什麼,所以你應該給它一些標誌。 – atmin

相關問題