Scala Stdin.readLine() 似乎没有按预期工作
Scala Stdin.readLine() does not seem to work as expected
我正在尝试编写一个简单的控制台客户端应用程序,我可以在其中向用户提供一些选项,获取他们的输入并采取相应的行动。如果我通过 intellij 运行 代码或将其粘贴到 scala 控制台中,它就可以工作。如果我 运行 它通过 sbt(这是我真正需要它 运行 的方式),我 运行 会遇到各种各样的问题。
我有 sbt 版本 0.13.8,OS 是 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$$anonfun$apply.apply(ProcessImpl.scala:58)
at sbt.BasicIO$$anonfun$processFully$$anonfun$apply.apply(ProcessImpl.scala:58)
at sbt.BasicIO$.readFully(ProcessImpl.scala:63)
at sbt.BasicIO$.processLinesFully(ProcessImpl.scala:69)
at sbt.BasicIO$$anonfun$processFully.apply(ProcessImpl.scala:58)
at sbt.BasicIO$$anonfun$processFully.apply(ProcessImpl.scala:55)
at sbt.SimpleProcessBuilder$$anonfun.apply$mcV$sp(ProcessImpl.scala:354)
at sbt.Spawn$$anon.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
中。有关如何在 sbt 中正确处理分叉的更多信息,请参阅 official docs。
我正在尝试编写一个简单的控制台客户端应用程序,我可以在其中向用户提供一些选项,获取他们的输入并采取相应的行动。如果我通过 intellij 运行 代码或将其粘贴到 scala 控制台中,它就可以工作。如果我 运行 它通过 sbt(这是我真正需要它 运行 的方式),我 运行 会遇到各种各样的问题。
我有 sbt 版本 0.13.8,OS 是 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$$anonfun$apply.apply(ProcessImpl.scala:58)
at sbt.BasicIO$$anonfun$processFully$$anonfun$apply.apply(ProcessImpl.scala:58)
at sbt.BasicIO$.readFully(ProcessImpl.scala:63)
at sbt.BasicIO$.processLinesFully(ProcessImpl.scala:69)
at sbt.BasicIO$$anonfun$processFully.apply(ProcessImpl.scala:58)
at sbt.BasicIO$$anonfun$processFully.apply(ProcessImpl.scala:55)
at sbt.SimpleProcessBuilder$$anonfun.apply$mcV$sp(ProcessImpl.scala:354)
at sbt.Spawn$$anon.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
中。有关如何在 sbt 中正确处理分叉的更多信息,请参阅 official docs。