这是我的问题:正常的while循环看起来像这样 -
while(condition){statements}
并且语句执行直到条件变为false
并且循环结束。我对这种陈述的逻辑感兴趣:
while((a=b.readLine) != null) { ... }
在我的案例中,它用于客户端 - 服务器通信。条件有时是正确的,有时候不是,但循环看起来像是永远测试条件,当为真时,{}
中的语句执行。在我看来,循环等待条件为真,然后运行语句。它是以某种方式与BufferedReader
和InputStreamReader
的工作方式有关吗?此外,似乎这个循环永远不会结束,它只是等待条件为true
然后运行语句,然后再次等待条件为true
等。我将感谢任何澄清。
答案 0 :(得分:4)
以下代码段
String a;
while((a = b.readLine()) != null) { // a = b.readLine() -> a -> a != null
...
}
相当于
String a = b.readLine();
while(a != null) {
...
a = b.readLine();
}
但第一种方式更简单,可读,Java允许在这里使用赋值运算符,因为它们返回了更新变量的值。
答案 1 :(得分:4)
这个成语
while ( (a = b.readLine()) != null) { /* body */ }
是一个普通的while
循环,但条件碰巧包含一个嵌入的赋值运算符,它产生赋值的结果,与null
进行比较。
b
是否正在从套接字,文件或任何其他输入流中读取,大概b
类似于BufferedReader
及其readLine()
方法。此方法仅在到达流末尾时返回null
。如果尚未到达流的末尾,它将阻止,但是还没有从流中读取由换行符组成的进一步输入。
当这样的行可用时,a
不是null
并且循环的主体执行。 readLine
的结果已分配给a
,以方便处理循环体。
当到达流的末尾时,a
为null
,while
循环结束。
这个习语允许轻松处理整个数据流,无论是来自整个文件,来自整个套接字连接,还是通常从整个输入数据流中读取。它看起来比简单的while
循环更复杂,但它只是一个条件更复杂的标准while
循环。
答案 2 :(得分:3)
while((a = b.readLine()) != null){ ... }
在每次迭代时,评估括号内的条件。
评估此表达式包括调用b.readLine()
,将返回值影响到a
,并将a
与null进行比较。
如文档所述,调用readLine()
包括阻塞,直到读取下一行。如果没有下一行,readLine()
将返回null。
因此,简而言之,这个while循环从读取器读取每一行,对行执行某些操作(在while块内)并在到达流末尾时停止。
答案 3 :(得分:0)
因为大多数IO流不会一次读取所有数据而是逐位读取,所以将read()或readLine()分配作为WHILE
条件的一部分可确保WHILE
随着输入流的逐位读取,块继续循环,直到没有剩余内容可供读取(也就是说,所有数据都已读取)。