BufferedReader 链接到套接字,readLine() != null 是如何工作的?

BufferedReader chained to socket, how does readLine() != null work?

我对这里发生的事情有点困惑。通过 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() "blocks" while 循环从激活直到 returns 一行。我的问题是,它如何检测到输入流中有东西,它如何知道它何时变为空?

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 调用将 return -1 以指示流已关闭。

BufferedReader.readLine() 只会 return null 当基础 reader return 存在时 没有更多数据,在 InputStreamReader 的情况下,只有在基础流已关闭时才会发生。

当套接字或 OutputStream 在另一侧关闭时,

readLine() 将 return 为 null。进行测试以了解其工作原理