【发布时间】:2010-10-11 08:06:24
【问题描述】:
根据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() 我希望读取第一个事件只会阻止读取第二个事件,但不会擦除或消耗太多流数据。为什么这样做会导致无法显示我的所有数据?
【问题讨论】:
-
您混淆了流的结尾,目前没有可用的数据。当当前没有数据可用时,它会阻塞。流结束,它返回-1。
标签: java blocking inputstream rxtx java-io