2009-11-10 5 views
0

Je lis plusieurs lignes de la console dans un programme Java en utilisant la commande readLine de la classe BufferedReader. Cependant, le programme s'arrête à la fin de la dernière ligne et ne se poursuit pas tant que je n'appuie pas sur retour. Comment puis-je éliminer cette pause?Suppression d'une pause après lecture avec readLine dans java

+3

Et quand exactement l'ordinateur détermine-t-il quand l'utilisateur a entré une ligne? Je veux dire que si vous éliminez le retour, qu'est-ce qui empêche l'ordinateur de se déplacer après l'écriture d'un caractère? – Bobby

Répondre

3

Que faites-vous exactement et qu'attendez-vous? J'ai deux suppositions:

  1. Vous avez un readLine() superflu à la fin du programme. Retirez-le ou modifiez les conditions de boucle de manière appropriée pour résoudre ce problème.
  2. Vous vous attendez à ce que le programme commence à fonctionner sur une ligne en cours de saisie (sans appuyer sur Retour à la fin). C'est là que vos attentes sont complètement fausses. readLine() renvoie une ligne complète et bloque pendant la saisie. Ainsi, l'appel attend jusqu'à ce que vous appuyiez sur Retour, puis renvoie la ligne que vous venez d'entrer. Pour obtenir une entrée pendant que l'utilisateur tape, BufferedReader ou readLine() sont très appropriés.
+0

juste vérifié les conditions de boucle, pas readLine superflu() ... – Pranav

+0

Cela fonctionne parfaitement bien - public class Boutons { public static void main (String [] args) throws java.lang.Exception { java.io. BufferedReader r = new java.io.BufferedReader (nouveau java.io.InputStreamReader (System.in)); Chaîne s; while (! (S = r.readLine()). StartsWith ("42")) System.out.println (s); } } – Pranav

+0

Pourriez-vous mettre le code que vous avez dans votre question avec le formatage approprié? Serait beaucoup plus facile à lire. – Joey

1

C'est un catch-22; vous ne pouvez pas connaître c'est la dernière ligne, jusqu'à ce qu'il soit complètement entré (y compris le retour chariot à la fin) et vous pouvez l'analyser. Donc, vous savez seulement que vous pourriez avoir sauté l'attente une fois que vous avez déjà raté votre chance. Cela suppose, bien entendu, que vous détectiez la dernière ligne en fonction de son contenu (par exemple, une chaîne vide, une chaîne spécifique "42", etc.). Si vous avez d'autres moyens de détecter la dernière ligne, vous pouvez l'utiliser comme condition de boucle while. Vous n'avez donc pas besoin d'attendre pour lire la ligne "sentinel" qui vous dit simplement de quitter. Mais dans l'exemple de code que vous avez affiché, vous n'obtenez accès à la ligne "42" qu'après avoir été complètement saisi - y compris une terminaison de ligne (retour chariot, EOF, etc.). Ainsi, jusqu'à ce que vous frappiez retour, cette ligne n'existe pas du point de vue du lecteur.

1

Une ligne est une séquence de caractères terminés CR ou CRLF. Et readline() fait juste ce que dit son nom: il lit une ligne .

Si vous avez d'autres indices pour déterminer la 'fin d'entrée', vous pouvez lire le caractère d'entrée par caractère jusqu'à ce que la condition 'fin d'entrée' soit vraie. Cela peut être un autre caractère ou une séquence spéciale de caractères comme une balise fermante si vous regardez une entrée XML.

Questions connexes