while 循环与 readLine()

while loop with a readLine()

这是我的问题:正常的 while 循环看起来像这样 -

while(condition){statements} 

and statements 执行直到条件变为 false 并且循环结束。我对这种说法的逻辑很感兴趣:

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

在我的案例中,它用于客户端-服务器通信。条件有时为真,有时不为真,但循环看起来像是在永远测试条件,当为真时,{} 中的语句就会执行。在我看来,循环等待条件为真,然后运行语句。它是否以某种方式与 BufferedReaderInputStreamReader 的工作方式有关?另外,这个循环似乎永远不会结束,它只是等待条件为 true 然后运行语句,然后再次等待条件为 true,等等。我会很感激任何澄清。

以下代码片段

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

等同于

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

但第一种方法更简单、更易读,并且 Java 允许在此处使用赋值运算符,因为它们 return 更新变量的值。

这个成语

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

是一个普通的while循环,但条件恰好包含一个嵌入的赋值运算符,它产生赋值的结果,与null.

进行比较

无论 b 是从套接字、文件还是任何其他输入流中读取,大概 b 类似于具有 readLine() 方法的 BufferedReader。当到达流的末尾时,此方法只会 return null 。如果尚未到达流的末尾,但尚未从流中读取包含换行符的进一步输入,它将阻塞。

当这样的行可用时,a 不是 null 并且循环体会执行。 readLine 的结果被分配给 a 以便于在循环体中处理。

到达流的末尾时,anullwhile 循环结束。

这个习惯用法允许轻松处理整个数据流,无论是来自整个文件、来自整个套接字连接,还是通常从整个输入数据流读取。它看起来比简单的 while 循环更复杂,但它只是条件更复杂的标准 while 循环。

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

在每次迭代中,都会计算括号内的条件。

评估此表达式包括调用 b.readLine(),将返回值影响到 a,并将 a 与 null 进行比较。

如文档所述,调用 readLine() 包括阻塞,直到读取下一行。如果没有下一行,readLine() returns null.

所以,简而言之,这个 while 循环从 reader 读取每一行,对该行(在 while 块内)做一些事情,并在到达流的末尾时停止。

因为大多数 IO 流不会一次读取所有数据,而是逐位读取,将 read() 或 readLine() 赋值作为 WHILE 条件的一部分可确保 WHILE 块继续循环,因为输入流被逐位读取,直到没有任何内容可读取(也就是说,所有数据都已读取)。