web-dev-qa-db-fra.com

Comment lire depuis l'entrée standard ligne par ligne?

Quelle est la recette Scala pour lire ligne par ligne à partir de l'entrée standard? Quelque chose comme l'équivalent 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());
        }
    }
}
89
Andrei Ciobanu

L’approche la plus simple consiste simplement à utiliser readLine(), qui fait partie de Predef. Cependant, c'est plutôt moche, car vous devez vérifier l'éventuelle valeur NULL:

object ScannerTest {
  def main(args: Array[String]) {
    var ok = true
    while (ok) {
      val ln = readLine()
      ok = ln != null
      if (ok) println(ln)
    }
  }
}

c'est tellement verbeux, vous préférez utiliser Java.util.Scanner au lieu.

Je pense qu'une approche plus jolie utilisera scala.io.Source:

object ScannerTest {
  def main(args: Array[String]) {
    for (ln <- io.Source.stdin.getLines) println(ln)
  }
}
130
itemState

Pour la console, vous pouvez utiliser Console.readLine. Vous pouvez écrire (si vous voulez vous arrêter sur une ligne vide):

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

Si vous catez un fichier pour générer l'entrée, vous devrez peut-être vous arrêter sur null ou vide en utilisant:

@inline def defined(line: String) = {
  line != null && line.nonEmpty
}
Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
52
Landei
val input = Source.fromInputStream(System.in);
val lines = input.getLines.collect
27
Jason

Pouvez-vous pas utiliser

var userinput = readInt // for integers
var userinput = readLine 
...

Tel que disponible ici: API Scaladoc

10
kaning