while 循环与 readLine()
while loop with a readLine()
这是我的问题:正常的 while 循环看起来像这样 -
while(condition){statements}
and statements 执行直到条件变为 false
并且循环结束。我对这种说法的逻辑很感兴趣:
while((a=b.readLine) != null) { ... }
在我的案例中,它用于客户端-服务器通信。条件有时为真,有时不为真,但循环看起来像是在永远测试条件,当为真时,{}
中的语句就会执行。在我看来,循环等待条件为真,然后运行语句。它是否以某种方式与 BufferedReader
和 InputStreamReader
的工作方式有关?另外,这个循环似乎永远不会结束,它只是等待条件为 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
以便于在循环体中处理。
到达流的末尾时,a
为 null
,while
循环结束。
这个习惯用法允许轻松处理整个数据流,无论是来自整个文件、来自整个套接字连接,还是通常从整个输入数据流读取。它看起来比简单的 while
循环更复杂,但它只是条件更复杂的标准 while
循环。
while((a = b.readLine()) != null){ ... }
在每次迭代中,都会计算括号内的条件。
评估此表达式包括调用 b.readLine()
,将返回值影响到 a
,并将 a
与 null 进行比较。
如文档所述,调用 readLine()
包括阻塞,直到读取下一行。如果没有下一行,readLine()
returns null.
所以,简而言之,这个 while 循环从 reader 读取每一行,对该行(在 while 块内)做一些事情,并在到达流的末尾时停止。
因为大多数 IO 流不会一次读取所有数据,而是逐位读取,将 read() 或 readLine() 赋值作为 WHILE
条件的一部分可确保 WHILE
块继续循环,因为输入流被逐位读取,直到没有任何内容可读取(也就是说,所有数据都已读取)。
这是我的问题:正常的 while 循环看起来像这样 -
while(condition){statements}
and statements 执行直到条件变为 false
并且循环结束。我对这种说法的逻辑很感兴趣:
while((a=b.readLine) != null) { ... }
在我的案例中,它用于客户端-服务器通信。条件有时为真,有时不为真,但循环看起来像是在永远测试条件,当为真时,{}
中的语句就会执行。在我看来,循环等待条件为真,然后运行语句。它是否以某种方式与 BufferedReader
和 InputStreamReader
的工作方式有关?另外,这个循环似乎永远不会结束,它只是等待条件为 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
以便于在循环体中处理。
到达流的末尾时,a
为 null
,while
循环结束。
这个习惯用法允许轻松处理整个数据流,无论是来自整个文件、来自整个套接字连接,还是通常从整个输入数据流读取。它看起来比简单的 while
循环更复杂,但它只是条件更复杂的标准 while
循环。
while((a = b.readLine()) != null){ ... }
在每次迭代中,都会计算括号内的条件。
评估此表达式包括调用 b.readLine()
,将返回值影响到 a
,并将 a
与 null 进行比较。
如文档所述,调用 readLine()
包括阻塞,直到读取下一行。如果没有下一行,readLine()
returns null.
所以,简而言之,这个 while 循环从 reader 读取每一行,对该行(在 while 块内)做一些事情,并在到达流的末尾时停止。
因为大多数 IO 流不会一次读取所有数据,而是逐位读取,将 read() 或 readLine() 赋值作为 WHILE
条件的一部分可确保 WHILE
块继续循环,因为输入流被逐位读取,直到没有任何内容可读取(也就是说,所有数据都已读取)。