Ich bin nicht immer das Ergebnis Ich erwarte, dass Verwenden von readline () in Java

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich bin mit dem Codeausschnitt unten, jedoch ist es nicht funktioniert ganz so verstehe ich es soll.

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();
    }
}

Aus der Lektüre der Javadoc über readLine() heißt es:

Liest eine Textzeile. Eine Linie betrachtet wird durch eine von einem Zeilenvorschub (\n), ein Wagenrücklauf (\r) oder ein Wagenrücklauf unmittelbar gefolgt von einem Zeilenvorschub beendet werden.

Returns : A String den Inhalt der Zeile enthält, einschließlich nicht linien Endzeichen oder null, wenn das Ende des Datenstroms erreicht wurde

Wirft : IOException - Wenn ein E / A-Fehler auftritt

Von meinem Verständnis dafür, readLine sollte null zum ersten Mal zurückkehrt keine Eingabe eingegeben wird, anders als ein Leitungsabschluss, wie \r. Allerdings endet dieser Code nur unendlich Looping nach oben. Nach dem Debuggen, habe ich, dass anstelle von null gefunden, wenn das Zeichen eingegeben werden nur eine Kündigung zurückgegeben wird, gibt es tatsächlich einen leeren String ( „“). Das macht keinen Sinn für mich. Was bin ich nicht richtig zu verstehen?

War es hilfreich?

Lösung

  

Von meinem Verständnis dafür, sollte readline das erste Mal null zurück, keine Eingabe eingegeben wird, anders als ein Leitungsabschluss, wie ‚\ r‘.

Das ist nicht richtig. readLine kehrt null, wenn das Ende des Stroms erreicht ist. Das heißt, zum Beispiel, wenn Sie eine Datei lesen und die Datei endet, oder wenn Sie von einer Steckdose und der Steckdose closses zu lesen.

Aber wenn Sie einfach die Konsole Eingang lesen, auf der Tastatur die Return-Taste treffen nicht ein Ende des Stroms darstellen. Es ist einfach ein Charakter, der zurückgegeben wird (\n oder \r\n auf Ihrem O abhängig).

Wenn Sie also sowohl auf dem leeren String und dem Ende der Linie zu durchbrechen wollen, sollten Sie tun:

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

Auch Ihr aktuelles Programm sollte funktionieren wie erwartet, wenn Sie Rohr einige Datei direkt in sie, etwa so:

java -cp . Echo < test.txt

Andere Tipps

Keine Eingabe nicht das gleiche wie das Ende des Stroms ist. Sie können in der Regel das Ende des Stroms in einer Konsole durch Drücken von Strg + D (AFAIK einige Systeme verwenden Strg + Z simulieren statt). Aber ich denke, das ist nicht das, was man so besser Test für leere Strings zusätzlich zu null Strings will.

Es gibt eine schöne Apache commons lang Bibliothek, die eine gute api für gemeinsame :) Aktionen hat. Sie könnten statisch StringUtils verwenden importieren und seine Methode verwenden isNotEmpty (String) zu erhalten:

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

Es könnte nützlich sein, ein Tag :) Es gibt auch andere nützliche Klassen in dieser lib.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top