【问题标题】:Get STDOUT from Runtime.getRuntime().exec() line-by-line rather than all at once从 Runtime.getRuntime().exec() 逐行获取 STDOUT,而不是一次全部获取
【发布时间】:2017-11-15 15:52:20
【问题描述】:

我正在使用以下代码从 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

我正在努力实现的目标
我想从 Java GUI 调用一些 Ruby 脚本,并让脚本的输出逐渐显示在文本窗格中。使用上面的代码,脚本中的 STDOUT 在脚本终止时立即显示在文本窗格中(并且Inputstream 可能已刷新)。

编辑:
问题是 Ruby 正在缓冲 STDOUT。由$stdout.sync = true修复。

【问题讨论】:

  • $stdout.sync = true 添加到您的 ruby​​ 脚本中。
  • @SotiriosDelimanolis 就是这样。太感谢了。我知道它必须是这样的。

标签: java process inputstream stdin bufferedreader


【解决方案1】:

你有没有在 System.out.println() 之后尝试过 Thread.sleep(1000)。您必须捕获一些 InterruptedException。你的编辑肯定会告诉你的。

【讨论】:

  • 睡眠一秒只是一个例子。我实际上会有一个需要一些未知时间的任务。
  • 好吧:那是不可能的。一个想法是在 ruby​​ 中放置一个分隔符,Java 输入流正在等待。但这不会那么容易。请记住,它只是 Java 中的一个流。这个流不知道接下来会发生什么,所以你应该给它一些标志。
猜你喜欢
  • 2015-12-09
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2018-02-06
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多