2017-06-13 31 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

相关问题