我对这里发生的事情有点困惑。通过 Head First Java,我正在制作一个多线程服务器。 我不明白的部分在这里,其中 reader 是链接到 InputStream(socket.getInputStream()) 的 BufferedReader:
class IncomingReader implements Runnable {
public void run() {
String message;
try {
while ((message = reader.readLine()) != null){
System.out.println("client read " + message);
incoming.append(message + "\n");
}
特别是
while ((message = reader.readLine()) != null)
激活?
我的意思是,如果没有来自服务器的输入,它不应该 == null,如果不是,readLine() 方法本身是否有某种循环来检测来自服务器的数据溪流?
我知道 readLine() 会“阻止”while 循环激活,直到它返回一行。我的问题是,它如何检测到输入流中有内容,它如何知道它何时变为空?
最佳答案
My question is, how does it detect that there is something in the inputstream, how does it know when it becomes null?
实际上,这与 socket.getInputStream()
中的 InputStream
有关,而不是 BufferedReader
。除非流已关闭,否则对 InputStream.read()
的任何调用都将阻塞,直到有可用数据为止。因此,如果服务器未提供任何数据,但套接字仍处于打开状态,则调用将被阻止。
如果连接关闭(由任一端),则将读取所有剩余数据,然后以后的 read
调用将返回 -1 以指示流已关闭。
BufferedReader.readLine()
只会在底层读取器返回将不再有数据时返回null
,在这种情况下InputStreamReader
只有在底层流已关闭时才会发生。
关于java - BufferedReader 链接到套接字,readLine() != null 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211006/