Java 如何逐行读取标准输入?
从标准输入中逐行读取的Scala方法是什么?类似于等效的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
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]())
}