IT-Swarm.Net

如何逐行读取标准输入?

什么是标准输入逐行读取的Scala配方?类似于等效的Java代码:

import Java.util.Scanner; 

public class ScannerTest {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            System.out.println(sc.nextLine());
        }
    }
}
89
Andrei Ciobanu

最直接的方法只使用readLine(),它是Predef的一部分。但是,当你需要检查最终的空值时,这是相当丑陋的:

object ScannerTest {
  def main(args: Array[String]) {
    var ok = true
    while (ok) {
      val ln = readLine()
      ok = ln != null
      if (ok) println(ln)
    }
  }
}

这是如此冗长,你宁愿使用Java.util.Scanner。.

我认为更漂亮的方法将使用scala.io.Source

object ScannerTest {
  def main(args: Array[String]) {
    for (ln <- io.Source.stdin.getLines) println(ln)
  }
}
130
itemState

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

对于控制台,您可以使用Console.readLine。你可以写(如果你想停在一个空行):

Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))

如果您捕获文件以生成输入,则可能需要使用以下命令停止null或empty:

@inline def defined(line: String) = {
  line != null && line.nonEmpty
}
Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
52
Landei
val input = Source.fromInputStream(System.in);
val lines = input.getLines.collect
27
Jason

递归版本(编译器检测尾递归以改进堆使用),

def read: Unit = {
  val s = scala.io.StdIn.readLine()
  println(s)
  if (s.isEmpty) () else read 
}

请注意Scala 2.11中io.StdIn的使用。另请注意,通过这种方法,我们可以在最终返回的集合中累积用户输入 - 除了打印输出外。也就是说,

import annotation.tailrec

def read: Seq[String]= {

  @tailrec
  def reread(xs: Seq[String]): Seq[String] = {
    val s = StdIn.readLine()
    println(s)
    if (s.isEmpty()) xs else reread(s +: xs) 
  }

  reread(Seq[String]())
}
10
elm

你能用吗?

var userinput = readInt // for integers
var userinput = readLine 
...

可在此处获得: Scaladoc API

10
kaning