2008-08-24 4 views
4

Ich benutze das Code-Snippet unten, aber es funktioniert nicht ganz so, wie ich es verstehe.Ich erhalte das Ergebnis nicht Ich erwarte Verwendung von readLine() in Java

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

Von den Javadoc über readLine() Lesen heißt es:

eine Textzeile liest. Eine Zeile wird entweder durch einen Zeilenvorschub (\n), einen Wagenrücklauf (\r) oder einen Wagenrücklauf gefolgt von einem Zeilenvorschub beendet.

Returns: A String den Inhalt der Zeile, nicht einschließlich Zeilenabschlusszeichen oder null, wenn das Ende des Stroms erreicht

Wirft wurde enthält: IOException - Wenn ein I/O-Fehler treten auf

von meinem Verständnis dafür, readLine sollte null zum ersten Mal zurückkehrt keine Eingabe andere eingegeben wird als ein Leitungsabschluss, wie \r. Dieser Code endet jedoch endlos. Nach dem Debuggen habe ich festgestellt, dass anstelle der Rückgabe von null, wenn nur ein Beendigungszeichen eingegeben wird, tatsächlich eine leere Zeichenfolge ("") zurückgegeben wird. Das ergibt für mich keinen Sinn. Was verstehe ich nicht richtig?

Antwort

10

Aus meinem Verständnis davon, sollte readLine Null zurückgeben, wenn zum ersten Mal keine Eingabe eingegeben wird, außer einem Zeilenende, wie '\ r'.

Das ist nicht korrekt. readLine wird null zurückgeben, wenn das Ende des Streams erreicht ist. Das heißt zum Beispiel, wenn Sie eine Datei lesen und die Datei endet, oder wenn Sie von einem Socket lesen und der Socket schließt.

Wenn Sie jedoch nur die Konsoleneingabe lesen, ist das Drücken der Eingabetaste auf Ihrer Tastatur kein Ende des Streams. Es ist einfach ein Zeichen, das zurückgegeben wird (\n oder \r\n abhängig von Ihrem Betriebssystem).

Also, wenn Sie sowohl auf den leeren String und das Ende der Linie zu durchbrechen wollen, sollten Sie tun:

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

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

java -cp . Echo < test.txt 
+0

Liefert readLine() die Zeile plus den Zeilenumbruch charater - '\ n' oder nur die Zeile? – Ashwin

+0

Von JavaDoc: "Eine Zeichenfolge, die den Inhalt der Zeile enthält, ohne Zeilenabschlusszeichen oder null, wenn das Ende des Streams erreicht wurde". –

3

Keine Eingabe ist nicht dasselbe wie das Ende des Streams. Sie können in der Regel durch Drücken von Strg + D (AFAIK einige Systeme verwenden Ctrl +Z statt), um das Ende des Stroms in einer Konsole simulieren. Aber ich denke, das ist nicht das, was Sie wollen, also testen Sie besser auf leere Strings zusätzlich zu Null Strings.

1

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

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

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

Verwandte Themen