java - txt - ¿Cómo leer desde la entrada estándar línea por línea?
mostrar el contenido de un archivo txt en java (5)
¿Cuál es la receta de Scala para leer línea por línea de la entrada estándar? Algo así como el código Java equivalente:
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());
}
}
}
El enfoque más sencillo simplemente usará readLine()
que es parte de Predef
. sin embargo, eso es bastante feo, ya que necesita verificar el posible valor nulo:
object ScannerTest {
def main(args: Array[String]) {
var ok = true
while (ok) {
val ln = readLine()
ok = ln != null
if (ok) println(ln)
}
}
}
esto es muy detallado, preferiría usar java.util.Scanner
lugar.
Creo que un enfoque más bonito usará scala.io.Source
:
object ScannerTest {
def main(args: Array[String]) {
for (ln <- io.Source.stdin.getLines) println(ln)
}
}
No puedes usar
var userinput = readInt // for integers
var userinput = readLine
...
Como está disponible aquí: Scaladoc API
Para la consola, puede usar Console.readLine
. Puede escribir (si desea detenerse en una línea vacía):
Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))
Si adquiere un archivo para generar la entrada, puede que necesite detenerse en nulo o vacío usando:
@inline def defined(line: String) = {
line != null && line.nonEmpty
}
Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
Una versión recursiva (el compilador detecta una recursividad de cola para un uso mejorado del montón),
def read: Unit = {
val s = scala.io.StdIn.readLine()
println(s)
if (s.isEmpty) () else read
}
Tenga en cuenta el uso de io.StdIn
de Scala 2.11. También tenga en cuenta que con este enfoque podemos acumular la entrada del usuario en una colección que finalmente se devuelve, además de imprimirse. A saber,
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]())
}
val input = Source.fromInputStream(System.in);
val lines = input.getLines.collect