Java 从Runtime.getRuntime().exec()逐行获取标准输出,而不是一次获取所有标准输出

Java 从Runtime.getRuntime().exec()逐行获取标准输出,而不是一次获取所有标准输出,java,process,inputstream,stdin,bufferedreader,Java,Process,Inputstream,Stdin,Bufferedreader,我正在用下面的代码从Java执行一个脚本 try (BufferedReader input = new BufferedReader(new InputStreamReader(Runtime.getRuntime() .exec("ruby test.rb").getInputStream()))) { String line = null; while ((line = input.readLine()) != null) {

我正在用下面的代码从Java执行一个脚本

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

我正在努力实现的目标
我想从JavaGUI调用一些Ruby脚本,并让脚本的输出以增量方式显示在文本窗格中。使用上面的代码,脚本终止时,脚本中的STDOUT会立即显示在文本窗格中(并且
Inputstream
可能会被刷新)

编辑:

问题是Ruby正在缓冲标准输出。修正者:
$stdout.sync=true

您在System.out.println()之后尝试过Thread.sleep(1000)吗。你必须抓住一些被打断的异常。您的编辑器将肯定地告诉您。

您在System.out.println()之后尝试过Thread.sleep(1000)了吗。你必须抓住一些被打断的异常。你的编辑肯定会告诉你的。

一秒钟的睡眠只是一个例子。实际上,我会有一个任务,它需要一些未知的时间。好吧,那是不可能的。一个想法是在ruby中放置一个分隔符,Java inputstream正在等待它。但这并不容易。记住,它只是Java中的一个流。这个流不能知道下一步将发生什么,所以你应该给它一些标志。睡眠一秒钟只是一个例子。实际上,我会有一个任务,它需要一些未知的时间。好吧,那是不可能的。一个想法是在ruby中放置一个分隔符,Java inputstream正在等待它。但这并不容易。记住,它只是Java中的一个流。此流无法知道下一步将发生什么,因此您应该给它一些标志。将
$stdout.sync=true
添加到您的ruby脚本中。@SotiriosDelimanolis就是这样。非常感谢你。我知道它必须是这样的。将
$stdout.sync=true
添加到您的ruby脚本中。@SotiriosDelimanolis就是这样。非常感谢你。我知道一定是这样的。