0

ObjectInputStream.available()正如它在's javadoc中所说:

返回可以在不阻塞的情况下读取的字节数。

我们应该能够像使用以下代码一样Scanner.hasNext()

if (inputStream.available() > 0) {
    Object input = inputStream.readObject();
}

但是当我使用它时,即使流中有一些未读数据,这种情况也不会得到true

实际上我在客户端-服务器应用程序中以这种方式使用它,它卡在if

    while (continueListening) {
        Object responseObj;
        try {
            if (inputStream.available() == 0) { // this condition is always met
                continue;
            }
            responseObj = inputStream.readObject();
            .
            .
            .
4

1 回答 1

1

来自InputStreamJavaDoc

返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。[...]

InputStream 类的可用方法总是返回 0。

available()因此,像您所做的那样依赖 的结果通常不是一个好主意。您正在循环,0以等待数据。相反,您应该使用专用线程并调用readObject()它将阻塞,直到有足够的数据可用或抛出异常,例如,如果连接在读取时关闭。

Scanner.hasNext()如果没有(完全)读取下一个令牌,也可能会阻塞。

于 2013-07-09T18:10:55.487 回答