首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何逐行读取标准输入?

问如何逐行读取标准输入?
EN

Stack Overflow用户
提问于 2011-01-03 23:18:18
回答 6查看 77K关注 0票数 93

从标准输入中逐行读取的Scala秘诀是什么?类似于等价的java代码:

代码语言:javascript
复制
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());
        }
    }
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-03 23:43:32

最直接的方法就是使用Predef的一部分readLine()。然而,这是相当丑陋的,因为您需要检查最终的空值:

代码语言:javascript
复制
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

代码语言:javascript
复制
object ScannerTest {
  def main(args: Array[String]) {
    for (ln <- io.Source.stdin.getLines) println(ln)
  }
}
票数 133
EN

Stack Overflow用户

发布于 2011-01-03 23:24:33

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

代码语言:javascript
复制
Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))

如果您通过cat文件来生成输入,则可能需要使用以下命令在null或empty上停止:

代码语言:javascript
复制
@inline def defined(line: String) = {
  line != null && line.nonEmpty
}
Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
票数 53
EN

Stack Overflow用户

发布于 2011-01-03 23:37:08

代码语言:javascript
复制
val input = Source.fromInputStream(System.in);
val lines = input.getLines.collect
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4585655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档