Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ObjectInputStream.available()作为扫描程序的eqilivant.hasNext()的_Java_Networking_Inputstream_Objectinputstream - Fatal编程技术网

Java 使用ObjectInputStream.available()作为扫描程序的eqilivant.hasNext()的

Java 使用ObjectInputStream.available()作为扫描程序的eqilivant.hasNext()的,java,networking,inputstream,objectinputstream,Java,Networking,Inputstream,Objectinputstream,正如ObjectInputStream.available()的javadoc中所说: 返回无阻塞情况下可以读取的字节数 我们应该能够像Scanner.hasNext()一样使用以下代码 但当我使用它时,即使流中有一些未读的数据,这种情况也不会得到true 实际上,我在客户机-服务器应用程序中以这种方式使用它,它会被困在if: while (continueListening) { Object responseObj; try {

正如
ObjectInputStream.available()
的javadoc中所说:

返回无阻塞情况下可以读取的字节数

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

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

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

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

返回可从此输入流读取(或跳过)的字节数的估计值,而无需在下次调用此输入流的方法时阻塞。 [……]

类InputStream的可用方法始终返回0

因此,像您那样依赖
available()
的结果通常不是一个好主意。在
0
的情况下,您正在循环,忙着等待数据。相反,您应该使用一个专用线程,只需调用
readObject()
,该线程将阻塞,直到有足够的数据可用或引发异常,例如,如果在读取时关闭了连接


如果下一个标记还没有被读取(完全),那么可能也会阻塞。

关键短语似乎是“不阻塞”。@LouisWasserman所以当有一些数据可读取时,流不会阻塞线程,是吗?为什么投票否决?我写错代码了,我问错了!术语“阻塞”肯定包括“等待来自服务器的额外通信”。
available()
将只返回已接收的字节数。像这样使用isConnected()是没有意义的。当对等机断开连接时,它不会神奇地变成错误。当您断开连接时,它将变为错误。可能吧。我想在(continueListening)时不断检查
,因为当输入流等待数据时,我可能会设置
continueListening=false
,但我知道不再有数据了,我想关闭connection@MJafarMash:Just
close()
如果要终止等待数据,请从另一个线程执行
InputStream
readObject()
方法将被取消阻止,并抛出一个
IOException
。或者设置读取超时,并在每次过期时检查布尔值。
    while (continueListening) {
        Object responseObj;
        try {
            if (inputStream.available() == 0) { // this condition is always met
                continue;
            }
            responseObj = inputStream.readObject();
            .
            .
            .