2016-03-24 10 views
2

Hier ist meine Frage: normal, während sieht Schleife wie diese -while-Schleife mit einem readline()

while(condition){statements} 

und Anweisungen ausführen, bis die Bedingung false und die Schleife wird ist vorbei. Ich interessiere mich für Logik dieser Art von Aussage:

while((a=b.readLine) != null) { ... } 

Es ist in Client-Server-Kommunikation in meinem Fall verwendet. Die Bedingung ist manchmal wahr, manchmal nicht, aber Schleife sieht so aus, als würde sie die Bedingung für immer testen, und wenn sie wahr ist, werden Anweisungen in {} ausgeführt. Es sieht für mich aus, dass die Schleife darauf wartet, dass die Bedingung wahr ist, und dann Anweisungen ausführt. Ist es irgendwie mit der Art und Weise verbunden BufferedReader und InputStreamReader arbeiten oder was? Es scheint auch, dass diese Schleife nie vorbei ist, wartet nur auf eine Bedingung, um true zu sein, und dann Anweisungen ausgeführt wird, und dann wieder auf eine Bedingung wartet, um true usw. zu sein. Ich wäre für jede Erläuterung dankbar.

+0

Wenn Sie ein "Null" -Objekt an den Server senden, auf den Sie sich beziehen, würde es sich herauswerfen. – 3kings

+1

'BufferedReader', wenn' readLine() 'aufgerufen wird, wird' null' zurückgeben, wenn es alle Zeilen einer Datei – Maljam

+0

@ 3kings Nonsense erschöpft. Sie können kein Null-Objekt senden. Die Schleife wird beendet, wenn 'readLine()' null zurückgibt, was am Ende des Streams geschieht. Sieh den Javadoc. – EJP

Antwort

3
while((a = b.readLine()) != null){ ... } 

Bei jeder Iteration wird die Bedingung innerhalb der Klammern ausgewertet.

Die Auswertung dieses Ausdrucks besteht darin, b.readLine() aufzurufen, den zurückgegebenen Wert auf a zu ändern und a mit null zu vergleichen.

Der Aufruf von readLine(), wie dokumentiert, besteht darin, zu blockieren, bis die nächste Zeile gelesen wird. Wenn keine nächste Zeile vorhanden ist, gibt readLine() null zurück.

Kurz gesagt, diese while-Schleife liest jede Zeile aus dem Lesegerät, macht etwas mit der Zeile (innerhalb des while-Blocks) und stoppt, wenn das Ende des Streams erreicht ist.

4

Der folgende Codeausschnitt

String a; 
while((a = b.readLine()) != null) { // a = b.readLine() -> a -> a != null 
    ... 
} 

äquivalent zu

String a = b.readLine(); 
while(a != null) { 
    ... 
    a = b.readLine(); 
} 

aber der erste Weg ist einfacher, lesbar und Java ermöglicht es Betreibern, hier Zuordnung verwenden, da sie den Wert einer erneuten Rückkehr Variable.

4

Dieses Idiom

while ((a = b.readLine()) != null) { /* body */ } 

ist eine normale while Schleife, aber die Bedingung passiert, einen eingebetteten Zuweisungsoperator enthalten, das das Ergebnis der Zuordnung ergibt, die zu null verglichen wird.

Ob b aus einem Sockel, eine Datei oder einem anderen Eingabestrom zu lesen, vermutlich ist b so etwas wie ein BufferedReader mit seiner readLine() Methode. Diese Methode gibt nur null zurück, wenn das Ende des Streams erreicht ist. Es wird blockiert, wenn das Ende des Streams noch nicht erreicht wurde, aber noch keine weitere Eingabe, bestehend aus einem Newline-Zeichen, wurde aus dem Stream ausgelesen. Wenn eine solche Linie verfügbar ist, ist a nicht null und der Körper der Schleife ausgeführt. Das Ergebnis von readLine wird a zur bequemen Verarbeitung mit dem Körper der Schleife zugewiesen.

Wenn das Ende des Streams erreicht ist, a ist null und die while Schleife endet.

Dieses Idiom ermöglicht die einfache Verarbeitung eines gesamten Datenstroms, unabhängig davon, ob es sich um eine gesamte Datei, um eine gesamte Socket-Verbindung handelt oder aus einem anderen Datenstrom. Es sieht komplizierter aus als ein einfacherer while Loop, aber es ist nur ein Standard while Loop mit einem komplizierteren Zustand.

+0

Ich habe einige Client-Server-Chat-Anwendungen über Socket-Verbindung gemacht. Es bedeutet, dass der Kern meiner Frage tatsächlich die Art der readLine() -Methode ist. Also wird diese Schleife beendet, wenn das Ende des Streams erreicht ist ... Aber wann ist das? Wenn der Stream geschlossen ist? – Seba

+0

Schließen Sie den Stream vom anderen Ende des Sockets wird dies tun; Wenn Sie den Socket selbst schließen, werden auch seine Streams geschlossen. – rgettman

+0

Also im Grunde läuft diese Schleife, bis Stream oder Socket geschlossen ist. Es wird nicht beendet, egal, dass nichts gelesen wird. Es ist nicht beendet, bis der Strom tot ist? – Seba