如何逐行读取标准输入?

2022-08-31 11:01:11

从标准输入逐行读取的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());
        }
    }
}

答案 1

最直接的方法将仅使用 其中的一部分。但是,这是相当丑陋的,因为您需要检查最终的空值: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)
  }
}

答案 2

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

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

如果 cat 文件生成输入,则可能需要使用以下命令在 null 或空时停止:

@inline def defined(line: String) = {
  line != null && line.nonEmpty
}
Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))

推荐