【问题标题】:BufferedReader chained to socket, how does readLine() != null work?BufferedReader 链接到套接字, readLine() != null 是如何工作的?
【发布时间】:2015-05-26 11:42:18
【问题描述】:

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

【问题讨论】:

    标签: java multithreading sockets blocking


    【解决方案1】:

    我的问题是,它如何检测到输入流中有东西,它如何知道它何时变为空?

    这实际上与来自socket.getInputStream()InputStream 的关系比BufferedReader 的关系更大。除非流已关闭,否则对 InputStream.read() 的任何调用都会阻塞,直到有可用数据为止。因此,如果服务器没有提供任何数据,但套接字仍处于打开状态,则调用将阻塞。

    如果连接关闭(通过任一端),则将读取任何剩余数据,然后未来的read 调用将返回 -1 以指示流已关闭。

    BufferedReader.readLine() 只会在底层读取器返回 没有更多数据时返回 null,在 InputStreamReader 的情况下,只有在底层流已关闭时才会发生.

    【讨论】:

    • 这完美地回答了我的问题!因此,InputStream 只是只要套接字打开就坐在那里。它是否通过某种循环不断检查数据以进行更新?
    • @Kameron:恐怕我不确定你的意思。在 JVM 和操作系统方面,提供数据的方式将是非常特定于实现的。
    • 不用担心。我想我还是得到了答案。很有帮助。
    【解决方案2】:

    当套接字或 OutputStream 在另一侧关闭时,readLine() 将返回 null。做一个测试看看它是如何工作的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2016-01-17
      • 2016-01-08
      • 2016-01-03
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多