Scala Stdin.readLine() 似乎没有按预期工作

标签 scala io console sbt

我正在尝试编写一个简单的控制台客户端应用程序,我可以在其中向用户提供一些选项,获取他们的输入并采取相应的行动。如果我通过 intellij 运行代码或将其粘贴到 Scala 控制台中,则它可以工作。如果我通过 sbt 运行它(这是我真正需要它运行的方式),我会遇到各种各样的问题。

我有 sbt 版本 0.13.8,操作系统是 Mac,我的 build.sbt 包含:

scalaVersion := "2.11.6"
fork in run := true

编辑 我从最小的 scala 激活器模板开始,以防在这种情况下有用的信息

我已将代码简化为准系统,
import scala.io.StdIn._

object TestClient {
  def main(args: Array[String]): Unit = {
    join()
  }

  def join(): Unit = {
    val name = readLine(s"Enter your name.${System.getProperty("line.separator")}")
    name match {
      case n: String => println(n)
      case o => {
        println(s"invalid name ${o}")
        join()
      };
    }
  }
}

当进入 sbt 并从提示输入运行时。以下情况之一似乎发生

1)我一运行就会得到这个异常
Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3332)
        at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
        at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:569)
        at java.lang.StringBuffer.append(StringBuffer.java:369)
        at java.io.BufferedReader.readLine(BufferedReader.java:370)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at sbt.BasicIO$$anonfun$processFully$1$$anonfun$apply$8.apply(ProcessImpl.scala:58)
        at sbt.BasicIO$$anonfun$processFully$1$$anonfun$apply$8.apply(ProcessImpl.scala:58)
        at sbt.BasicIO$.readFully$1(ProcessImpl.scala:63)
        at sbt.BasicIO$.processLinesFully(ProcessImpl.scala:69)
        at sbt.BasicIO$$anonfun$processFully$1.apply(ProcessImpl.scala:58)
        at sbt.BasicIO$$anonfun$processFully$1.apply(ProcessImpl.scala:55)
        at sbt.SimpleProcessBuilder$$anonfun$3.apply$mcV$sp(ProcessImpl.scala:354)
        at sbt.Spawn$$anon$3.run(ProcessImpl.scala:17)

2)
没有内存问题,但在无限循环中获取这些消息,因此 readline 似乎没有等待任何输入
background log: info: Enter your name.
background log: info: invalid name null
background log: info: Enter your name.
background log: info: invalid name null
...

无论哪种方式,我都无法在控制台中实际输入任何输入。不确定我错过了什么或做错了什么

最佳答案


connectInput in run := true

在您的 build.sbt .见 official docs有关如何在 sbt 中正确处理 fork 的更多信息。

关于Scala Stdin.readLine() 似乎没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29538779/

相关文章:

scala - 难以理解函数语法

javascript - 无法使用 JavaScript 更改 HTML 元素的颜色

scala - 如何使用 akka 连接到 Unix 套接字?

scala - slick 可以根据模型自动在数据库中创建表(生成 SQL 并执行)吗?

python - 将二进制数据打包和解包到列表中的最快方法

android - 实现读取数据的最佳方式

c - 无法找到 xv6 函数 gets 的源代码

objective-c - 如何轻松重定向 NSTextView 中的控制台输出?

c++ - Windows 应用程序启动我的控制台

scala - Scala 中根据运行时类型信息进行区分