Java 如何逐行读取标准输入?

Java 如何逐行读取标准输入?,java,scala,io,java.util.scanner,Java,Scala,Io,Java.util.scanner,从标准输入中逐行读取的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.nextLi

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

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

如果对文件进行cat运算以生成输入,则可能需要使用以下命令在null或empty上停止:

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

最直接的方法是使用
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)
  }
}
对象扫描测试{
def main(参数:数组[字符串]){
对于(ln您不能使用

var userinput = readInt // for integers
var userinput = readLine 
...
此处提供:

递归版本(编译器检测尾部递归以提高堆使用率)

请注意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]())
}

正如在其他评论中简要指出的,自Scala 2.11.0以来,您可以将其替换为:

//读取标准数据行,直到出现空白
导入scala.io.StdIn.readLine
var line=“”
做{
line=readLine()
println(“读取:+行)
}而(行!=“”)

我知道Console.readLine(),我正在寻找一个给定的配方。从标准输入中逐行读取的“scala”方式。我想你的意思是
takeWhile(!=null)
取决于您想要停止的方式。查找空行通常是最简单的解决方案。请注意,在Scala 2.11.0
控制台中,readLine
已被弃用,请改用
StdIn.readLine
.takeWhile(选项(u).nonEmpty)
如果您想完全避免使用
null
关键字,可能会感觉更好。
io.Source.stdin
被定义为
scala.io.Source
类中的
def stdin=fromInputStream(System.in)
所以可能最好还是坚持使用
io.Source.stdin
。这在Scala 2.12.4中似乎不起作用,或者我没有找到合适的导入方法。它在Scala 2.12中起作用,只是
collect
方法在这个答案中被更改了,所以你只需调用
input.getLines
,这会给你一个
迭代器
。您可以使用
强制它具体化。toStream
。toList
取决于用例。Predef的readLine方法从2.11.0开始就被弃用,现在建议使用
scala.io.StdIn
@itemState中的方法。如果我使用“io.Source.StdIn.getLines”,我的程序不会结束将进入等待模式…如何处理此问题…这与所提供的带有循环的代码不同
var userinput = readInt // for integers
var userinput = readLine 
...
def read: Unit = {
  val s = scala.io.StdIn.readLine()
  println(s)
  if (s.isEmpty) () else read 
}
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]())
}