0

为什么我的这部分客户端代码总是为零?

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

4 回答 4

3

大概是因为还没有收到数据。尝试在不阻塞的情况下立即available()返回可用的数据量,因此如果您在建立连接后直接调用,我希望大部分时间都会收到 0。如果您稍等片刻,您可能会发现返回不同的值。available()available()

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

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

这将阻塞直到一些数据可用,但它很可能返回读取超过 16K 的数据。如果您想继续阅读直到到达流的末尾,则需要循环。

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

于 2013-05-20T08:35:47.380 回答
1

来自java 文档

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

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

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

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

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

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

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

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

于 2013-05-20T08:34:11.623 回答
0

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

您应该在延迟后检查此值,以查看它的增加。

于 2013-05-20T08:35:06.780 回答
0

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

只需阅读,直到您拥有所需的内容。它将阻塞,直到数据可用。

于 2013-05-20T08:41:47.707 回答