while循环与readLine()

时间:2016-03-24 21:02:02

标签: java while-loop bufferedreader readline inputstreamreader

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

while(condition){statements} 

并且语句执行直到条件变为false并且循环结束。我对这种陈述的逻辑感兴趣:

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

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

4 个答案:

答案 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,以方便处理循环体。

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

这个习语允许轻松处理整个数据流,无论是来自整个文件,来自整个套接字连接,还是通常从整个输入数据流中读取。它看起来比简单的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随着输入流的逐位读取,块继续循环,直到没有剩余内容可供读取(也就是说,所有数据都已读取)。