InputDataStream.available()始终为0 Java Socket Client

时间:2013-05-20 08:28:18

标签: java sockets tcp

为什么我的客户端代码的这部分始终为零?

InputStream inputStream = clientSocket.getInputStream();
int readCount = inputStream.available();  // >> IS ALWAYS ZERO
byte[] recvBytes = new byte[readCount];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int n = inputStream.read(recvBytes);

...

4 个答案:

答案 0 :(得分:3)

据推测,这是因为尚未收到 的数据。 available()尝试立即返回现有数据而不会阻塞,因此如果您在建立连接后直接致电available(),我预计会收到大部分时间。如果您等待一段时间,您可能会发现available()返回不同的值。

但是,我个人通常不会使用available()。我为这种情况创建了一个适当大小的缓冲区,然后阅读:

byte[] data = new byte[16 * 1024];
int bytesRead = stream.read(data);

这将阻止某些数据可用,但它可能会返回读取而不是16K的数据。如果你想继续阅读直到你到达流的末尾,你需要循环。

基本上这取决于你要做的事情,但available()在我的经验中很少有用。

答案 1 :(得分:0)

来自java docs

返回此输入流可以读取(或跳过)的字节数的估计值,而不会在下次调用此输入流的方法时阻塞。下一次调用可能是同一个线程或另一个线程。单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。 请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是绝对正确的。

如果通过调用close()方法关闭了此输入流,则此方法的子类实现可能会选择抛出IOException。

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

这个方法应该被子类覆盖。

这是一个注释,以了解它为什么返回0

在InputStreams中,read()调用被称为“阻塞”方法调用。这意味着如果在方法调用时没有可用的数据,该方法将等待数据可用。

available()方法告诉您在read()调用将阻止程序的执行流程之前可以读取多少字节。在大多数输入流上,对read()的所有调用都是阻塞的,这就是默认情况下可用返回0的原因。

但是,在某些流(例如BufferedInputStream,它有一个内部缓冲区)上,一些字节被读取并保存在内存中,因此您可以在不阻塞程序流的情况下读取它们。在这种情况下,available()方法告诉您缓冲区中保留了多少字节。

答案 2 :(得分:0)

根据文档,available()仅返回可以从流中无阻塞地读取的字节数。这并不意味着读操作不会返回任何内容。

你应该在延迟后检查这个值,看它是否会增加。

答案 3 :(得分:0)

available()的正确用法非常少,而且这不是其中之一。在这种情况下,没有数据到达所以它返回零,这是它应该做的。

阅读,直到找到你需要的东西。它会阻塞,直到数据可用。