Scala中StdIn.readLine的奇怪行为?

时间:2018-07-17 14:56:19

标签: scala sbt

我在Scala中遇到了StdIn.readLine的一些奇怪行为。这是代码摘录:

while (true) {
  print("prompt:>")
  var lbl = ""
  lbl = scala.io.StdIn.readLine()
  println("echo" + lbl)
}

奇怪的是,在运行时,readLine()会在打印出“提示:>”之前发生。

我有:

fork in run := true
connectInput in run := true

在我的build.sbt

有人知道发生了什么事吗?

3 个答案:

答案 0 :(得分:3)

输出是行缓冲的。打印提示后,您需要System.out.flush使其显示在控制台中。否则,它将等待缓冲区填充(或新行出现在输出中)。

答案 1 :(得分:1)

写入文件(并且将终端视为一个)非常昂贵,因此出于性能原因,标准输出被缓冲。这意味着写操作实际上仅在缓冲区已满或将行返回放入缓冲区后才发生。您可以使用System.out.flush强制刷新缓冲区。

但是,对于您的问题,您可能希望直接使用scala.io.StdIn.readLine("prompt:>"):它完全是您要尝试做的。

答案 2 :(得分:0)

在控制台中运行代码时遇到了这个问题,即在IntelliJ中的一段代码上按Ctrl + shift + X使其在控制台中运行。我添加了您在build.sbt中指示的行,并将输入内容输入到控制台中,在输入内容后使用Ctrl + Enter。仅出于您的信息,我的Scala代码是:

import scala.io.StdIn.{readLine}
val input = readLine("enter some word ")
println(s"the word is $input ")