2011-09-06 4 views
13

J'attends l'entrée avec le scanner jusqu'à ce qu'il n'y ait plus rien (c'est-à-dire lorsque l'utilisateur entre une ligne vide). Comment puis-je y parvenir?Comment tester une ligne vide avec Java Scanner?

J'ai essayé:

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

Mais cela me se coincer dans la boucle

Répondre

17

Voici une manière:

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!"); 
+2

Cela a un effet secondaire sur l'obtention de la ligne (par exemple, je dois diviser la ligne par des espaces, par exemple si je veux analyser des valeurs séparées par des espaces). Y at-il une méthode de type 'hasNextLine()' où le "pointeur" ne va pas à la ligne suivante? –

+0

Err, je ne comprends pas ce qui ne va pas avec la séparation de la ligne ... –

+1

@jiewmeng - quand vous appelez 'scanner.hasNext()' vous devrez toujours aller chercher la ligne pour vérifier si elle est vide et la traiter. Pourriez-vous expliquer pourquoi la réponse de Bart ne fonctionnerait pas pour vous? – luketorjussen

4

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

Q: Qu'est-ce que se passe-t-il si je numérise une ligne vide avec le scanner Java?

A: Cela dépend. Si vous utilisez nextLine(), une ligne vide sera lue dans une chaîne vide. Cela signifie que si vous deviez stocker la ligne vide dans une variable String, la variable tiendrait "". Il ne sera pas magasin "" ou de nombreux espaces ont été placés. Si vous utilisez next(), alors il ne lira pas les lignes vides du tout. Ils sont complètement ignorés.

Je pense que nextLine() va encore se déclencher sur une ligne vide, puisque techniquement le scanner aura la chaîne "" vide. Donc, vous pouvez vérifier if s.nextLine().equals("")

0

AlexFZ est correct, 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 un même problème et je l'ai résolu comme ceci:

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

0
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); 
3

Le problème avec les suggestions d'utiliser scanner.nextLine() est qu'il retourne en fait la ligne suivante en tant que String. Cela signifie que tout texte qui y est est consommé. Si vous êtes intéressé par l'analyse du contenu de cette ligne ... eh bien, tant pis! Vous devrez analyser le contenu du String retourné par vous-même.

Une meilleure façon 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; 
    } 
} 

Depuis (?=\S) est une assertion avant zéro largeur, il ne sera jamais consommer toute entrée. S'il trouve un texte non-blanc dans la ligne courante, 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à consommé tout le texte non-espace dans cette ligne.