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:Justclose()
如果要终止等待数据,请从另一个线程执行InputStream
。readObject()
方法将被取消阻止,并抛出一个IOException
。或者设置读取超时,并在每次过期时检查布尔值。
while (continueListening) {
Object responseObj;
try {
if (inputStream.available() == 0) { // this condition is always met
continue;
}
responseObj = inputStream.readObject();
.
.
.