如何从标准input逐行读取?
从标准input中逐行读取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()); } } }
最直接的方法是使用Predef
一部分readLine()
。 然而这是相当丑陋的,因为你需要检查最终的空值:
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) } }
对于控制台,您可以使用Console.readLine
。 你可以写(如果你想停在一个空行):
Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))
如果你捕捉一个文件来产生input,你可能需要使用下面的命令停止null或empty:
@inline def defined(line: String) = { line != null && line.nonEmpty } Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
val input = Source.fromInputStream(System.in); val lines = input.getLines.collect
你不能用吗?
var userinput = readInt // for integers var userinput = readLine ...
如下所示 : Scaladoc API
recursion版本(编译器检测到尾recursion以提高堆使用率),
def read: Unit = { val s = scala.io.StdIn.readLine() println(s) if (s.isEmpty) () else read }
请注意使用Scala 2.11中的io.StdIn
。 另外请注意,使用这种方法,我们可以将用户input累积到最终返回的集合中,并将其打印出来。 也就是说,
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]()) }