Java BufferedReader链接到套接字,readLine()如何运行无效工作?
我对这里发生的事情有点困惑。通过headfirstjava,我正在制作一个多线程服务器。 我不理解的部分是这里,其中reader是链接到InputStream(socket.getInputStream())的BufferedReader: 特别是Java BufferedReader链接到套接字,readLine()如何运行无效工作?,java,multithreading,sockets,blocking,Java,Multithreading,Sockets,Blocking,我对这里发生的事情有点困惑。通过headfirstjava,我正在制作一个多线程服务器。 我不理解的部分是这里,其中reader是链接到InputStream(socket.getInputStream())的BufferedReader: 特别是 while ((message = reader.readLine()) != null) 激活 我的意思是,如果没有来自服务器的输入,它不应该==null吗?如果没有,readLine()方法本身是否有某种循环来检测来自服务器流的数据 我知道re
while ((message = reader.readLine()) != null)
激活
我的意思是,如果没有来自服务器的输入,它不应该==null吗?如果没有,readLine()方法本身是否有某种循环来检测来自服务器流的数据
我知道readLine()会“阻止”while循环激活,直到它返回一行。我的问题是,它如何检测inputstream中是否有内容,它如何知道何时变为null
我的问题是,它如何检测inputstream中是否有内容,它如何知道何时变为null
实际上,这更多地与来自socket.getInputStream()
的InputStream
有关,而不是与BufferedReader
有关。对InputStream.read()
的任何调用都将被阻止,直到有可用数据,除非流关闭。因此,如果服务器不提供任何数据,但套接字仍然打开,则调用将被阻止
如果连接已关闭(在任意一端),则将读取任何剩余数据,然后未来的read
调用将返回-1以指示流已关闭
BufferedReader.readLine()
仅在底层读取器返回不再有数据时才会返回null
,而在InputStreamReader的情况下,只有在底层流已关闭时才会发生这种情况。readLine()当套接字或OutputStream在另一侧关闭时,将返回null。做一个测试看看它是如何工作的这完美地回答了我的问题!所以只要套接字打开,InputStream就一直存在。它是否经常通过某种循环检查数据以进行更新?@Kameron:恐怕我不知道你的意思。从JVM和操作系统的角度来看,数据可用的方式将非常具体于实现。我想我已经得到了答案。非常有用。
while ((message = reader.readLine()) != null)