available()
可靠地用于Java中的套接字编程吗?
我只关心它告诉我什么时候有可用于读取的字节,所以当我调用read方法时它们不会阻塞。
BufferedInputStream.available()
依赖于InputStream.available()
。
InputStream.available()的文档说明了这一点:
请注意,虽然InputStream的某些实现将返回 流中的总字节数,很多都不会。永远不会 正确使用此方法的返回值来分配缓冲区 旨在保存此流中的所有数据。 http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()
我不在乎它是否给出正确的字节数,只是当有可用于读取的字节时它不会给我0。我想知道BufferedInputStream.available()是否总是在Windows和Linux上用于此目的。
另外,我不确定“实现”的文档意味着什么。那指的是什么?到InputStream的子类?在不同操作系统上的Java?对于不同的JVM?
是否有人在Windows或Linux或其他系统上使用过available()并且它不起作用?
答案 0 :(得分:2)
您在问题中链接到的相同文档说:
单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。
所以我说它安全"从某种意义上说,当I / O不返回0时它不会阻塞。另一方面,当实际上有要读取的字节时,不能保证它将返回非零值。
请注意,InputStream
是一个抽象类,因此您拥有的任何InputStream
对象都必须是子类。这就是"实施"对文档的意义。任何具体的子类都将实现所有抽象方法。
答案 1 :(得分:1)
当我在other thread已经告诉你时,在SSLSocket上缠绕它肯定是不可靠。它总是返回零。