2009-11-15 14 views
4

J'utilise la classe scanner pour capturer l'entrée de l'utilisateur à partir de la ligne de commande (chaînes uniquement), comme alternative à ma précédente question.comment intercepter une entrée vide avec la classe de scanner en Java

La procédure suivante semble fonctionner correctement, sauf que les lignes vides ne sont pas interceptées comme elles le devraient par le second conditionnel. Par exemple, lorsque j'appuie sur Entrée, cela doit être capturé comme une ligne vide et le second conditionnel doit être vrai. Cependant une nouvelle ligne vide est affichée sur la console à chaque fois, avec toute la console "défilant" vers le haut si je continue à entrer, plutôt que la logique dans le conditionnel.

Existe-t-il un moyen approprié d'intercepter une entrée vide à partir de la ligne de commande à l'aide du scanner? (Quelqu'un frapper juste entrer, ou dans l'espace a frappé plusieurs fois, puis entrez)

Merci pour tout conseil

Machine aMachine = new Machine(); 
String select; 
Scanner br = new Scanner(System.in); 
while(aMachine.stillInUse()){ 
    select = br.next(); 
     if (Pattern.matches("[rqRQ1-6]", select.trim())) { 
     aMachine.getCommand(select.trim().toUpperCase()).execute(aMachine); 
     } 
     /* 
     * Ignore blank input lines and simply 
     * redisplay current status -- Scanner doesn't catch this 
     */ 
     else if(select.trim().isEmpty()){ 
     aMachine.getStatus(); 

     /* 
     * Everything else is treated 
     * as an invalid command 
     */ 
    else {     
      System.out.println(aMachine.badCommand()+select); 
      aMachine.getStatus(); 
     } 
    } 
+0

j'espérais aussi demander si c'est la bonne façon de lire l'entrée de l'utilisateur à partir de la ligne de commande. Quel excpetion commun dois-je gérer par exemple? Merci pour toutes les explications – denchr

+0

Pour être nitpicky, aucun de ce code ne lira à partir de la ligne de commande - vos arguments sont dans les arguments de main(). Mais vous parlez d'entrée standard. –

Répondre

1

Scanner est une implémentation de fichier « pour les nuls » E/S pour l'entrée. Il permet aux auteurs de didacticiels et de manuels d'écrire du code de démonstration sans se plaindre des complications.

Si vous voulez vraiment savoir ce que vous lisez, vous devez dire quelque chose comme

BufferedReader br = new BufferedReader(new FileReader("myfile.txt")) 

... et vous pouvez le faire

String line = br.readLine() 

voir rien que la vérité .

+0

Eh bien, je suis un peu incertain quant à la mise en œuvre à suivre. Dans l'autre poste que je suis en liaison ci-dessus, l'analyseur est loué en utilisant BufferedReader (new InputStreamReader (System.in)); – denchr

+1

Well Scanner est meilleur en termes de simplicité. C'est pire en termes de contrôle à grain fin. –

0

select = br.next();

... jusqu'à ce qu'il trouve un jeton approprié. Cela signifie qu'il attendra jusqu'à ce qu'un jeton revienne, par conséquent vous ne recevrez pas de ligne vide.

Essayez de remplacer ces lignes:

//select = br.next(); // old version with Scanner 

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); 
try { 
    select = bufferedReader.readLine(); 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 
System.out.println(">" + select + "<"); // should be able to see empty lines now...