Je n'obtiens pas le résultat que j'attends en utilisant readLine() en Java

StackOverflow https://stackoverflow.com/questions/25033

  •  09-06-2019
  •  | 
  •  

Question

J'utilise l'extrait de code ci-dessous, mais il ne fonctionne pas exactement comme je le comprends.

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line;
    try {
        line = br.readLine();
        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

En lisant le Javadoc sur readLine() ça dit:

Lit une ligne de texte.Une ligne est considérée comme terminée par l'un des sauts de ligne (\n), un retour chariot (\r), ou un retour chariot suivi immédiatement d'un saut de ligne.

Retour:UN String contenant le contenu de la ligne, à l'exclusion des caractères de fin de ligne, ou null si la fin du flux a été atteinte

Jetés: IOException - Si une erreur d'E/S se produit

D'après ma compréhension de cela, readLine devrait renvoyer null la première fois qu'aucune entrée n'est saisie autre qu'une fin de ligne, comme \r.Cependant, ce code finit par tourner en boucle à l'infini.Après le débogage, j'ai constaté qu'au lieu que null soit renvoyé lorsqu'un seul caractère de fin est saisi, il renvoie en fait une chaîne vide ("").Cela n'a pas de sens pour moi.Qu’est-ce que je ne comprends pas bien ?

Était-ce utile?

La solution

D'après ma compréhension de cela, readLine devrait renvoyer null la première fois qu'aucune entrée n'est saisie autre qu'une terminaison de ligne, comme ' '.

Ce n'est pas correct. readLine reviendra null si la fin du flux est atteinte.C'est, par exemple, si vous lisez un fichier et que le fichier se termine, ou si vous lisez à partir d'un socket et que le socket se ferme.

Mais si vous lisez simplement l'entrée de la console, appuyer sur la touche retour de votre clavier ne constitue pas une fin de flux.C'est simplement un caractère qui est renvoyé (\n ou \r\n selon votre système d'exploitation).

Donc, si vous souhaitez interrompre à la fois la chaîne vide et la fin de la ligne, vous devez faire :

while (line != null && !line.equals(""))

De plus, votre programme actuel devrait fonctionner comme prévu si vous y dirigez un fichier directement, comme ceci :

java -cp . Echo < test.txt

Autres conseils

Aucune entrée n’est la même que la fin du flux.Vous pouvez généralement simuler la fin du flux dans une console en appuyant sur Ctrl+D (AFAIK, certains systèmes utilisent Ctrl+Z plutôt).Mais je suppose que ce n'est pas ce que vous voulez, il est donc préférable de tester les chaînes vides en plus des chaînes nulles.

Il y a un joli langage apache commons bibliothèque qui a une bonne API pour les actions courantes :).Vous pouvez utiliser l'importation statique de StringUtils et utiliser sa méthode isNotEmpty(String ) pour obtenir :

while(isNotEmpty(line)) {
    System.out.println(line);
    line = br.readLine();
}

Cela pourrait être utile un jour :) Il existe également d'autres classes utiles dans cette bibliothèque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top