根据Java api,其InputStream.read()
描述为:
如果由于已到达流的末尾而没有字节可用,则返回值-1。此方法将阻塞,直到可用输入数据,检测到流的末尾或引发异常为止。
我有一个while(true)
循环进行读取,当流上没有任何内容发送时,我总是得到-1。那是意料之中的。
我的问题是read()何时会阻塞?因为如果没有任何数据,它将返回-1。我希望阻塞读取要等到接收到数据。如果您已到达输入流的末尾,难道read()不应仅等待数据而不是返回-1吗?
还是仅当有另一个线程访问该流并且您的read()无法访问该流时,read()才会阻塞?
这使我想到下一个问题。我曾经有一个事件监听器(由我的库提供),当数据可用时会通知我。收到通知后,我将调用while((aByte = read()) > -1)
存储字节。当我在很近的时间内收到两个事件,并且没有显示所有数据时,我感到很困惑。似乎只显示第二个事件的数据的尾端,而其余的则丢失了。
最终,我更改了代码,以便在发生事件时调用if(inputStream.available() > 0) while((aByte = read()) > -1)
存储字节。现在它可以正常工作,并且显示了我所有的数据。
有人可以解释这种行为吗?该InputStream.available()
是说要回,你可以阻止下一个调用方之前读取的字节数(流?)。即使我不使用.available(),我也希望第一个事件的读取只会阻止第二个事件的读取,而不会擦除或消耗过多的流数据。为什么这样做会导致我的所有数据都无法显示?
阿晨1998
紫衣仙女
相关分类