web-dev-qa-db-fra.com

Comment tester une ligne vierge avec Java Scanner?

J'attends une entrée avec le scanner jusqu'à ce qu'il n'y ait plus rien (c'est-à-dire lorsque l'utilisateur entre une ligne vierge) Comment est-ce que je réalise ceci? 

J'ai essayé:

while (scanner.hasNext()) {
    // process input
}

Mais ça va me coincer dans la boucle

14
Jiew Meng

Voici un moyen:

Scanner keyboard = new Scanner(System.in);
String line = null;
while(!(line = keyboard.nextLine()).isEmpty()) {
  String[] values = line.split("\\s+");
  System.out.print("entered: " + Arrays.toString(values) + "\n");
}
System.out.print("Bye!");
18
Bart Kiers

De http://www.Java-made-easy.com/Java-scanner-help.html :

Q: Que se passe-t-il si je numérise une ligne vierge avec le scanner de Java?

A: ça dépend. Si vous utilisez nextLine (), une ligne vide sera lue dans comme une chaîne vide. Cela signifie que si vous deviez stocker le blanc ligne dans une variable String, la variable contiendrait "". Ça ne sera pas stocker "" ou quel que soit le nombre d'espaces placés. Si vous utilisez next (), alors il ne lira pas du tout les lignes vierges. Ils sont complètement ignorés.

Mon hypothèse est que nextLine() se déclenchera toujours sur une ligne vide, puisque techniquement le scanner aura la chaîne vide "". Donc, vous pouvez vérifier if s.nextLine().equals("")

5
AlexFZ

Le problème avec les suggestions d'utilisation de scanner.nextLine() est qu'il renvoie en réalité la ligne suivante sous la forme d'une String. Cela signifie que tout le texte qui s'y trouve est consommé. Si vous souhaitez numériser le contenu de cette ligne… tant pis! Vous devrez analyser le contenu de la String retournée vous-même.

Un meilleur moyen serait d'utiliser

while (scanner.findInLine("(?=\\S)") != null) {
    // Process the line here…
    …

    // After processing this line, advance to the next line (unless at EOF)
    if (scanner.hasNextLine()) {
        scanner.nextLine();
    } else {
        break;
    }
}

Étant donné que (?=\S) est une assertion lookahead de largeur nulle, il ne consomme aucune entrée. S'il trouve du texte non-blanc dans la ligne en cours, il exécutera le corps de la boucle.

Vous pouvez omettre le else break; si vous êtes certain que le corps de la boucle aura déjà utilisé tout le texte non-blanc de cette ligne.

4
200_success
Scanner key = new Scanner(new File("data.txt"));
String data = "";

while(key.hasNextLine()){
    String nextLine = key.nextLine();

    data += nextLine.equals("") ? "\n" :nextLine;

}
System.out.println(data);
0
Rush2sk8

AlexFZ a raison, scanner.hasNext() sera toujours vrai et la boucle ne se termine pas, car il y a toujours une entrée de chaîne même si elle est vide "". 

J'ai eu le même problème et je l'ai résolu comme ceci:

do{
    // process input
}while(line.length()!=0);
Je pense que do-while conviendra mieux ici car vous devez évaluer les entrées après que l'utilisateur les a entrées.

0
hukko