【发布时间】:2012-08-18 11:43:42
【问题描述】:
available() 在 Java 中用于套接字编程是否可靠?
我只关心它告诉我何时有字节可供读取,这样当我调用读取方法时它们不会阻塞。
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() 但没有用?
【问题讨论】:
-
永远不要使用
available。曾经。如果您想在bytes 可用于reading 时收到通知,请查看non-blocking IO。 -
从不使用available的原因是什么?如果我们永远不应该使用它,那它为什么存在呢?
-
如果您确定您知道
available将如何与您的特定InputStream一起使用,那么您可以使用它。然而,InputStream的大多数用法归结为FileInputStream或Socket.getInputStream(),两者都不能保证返回正确的available值。 -
@TedHopp @mudge
available的问题是它总是可以返回0并且永远不会出错。最好不要依赖available作为任何指标。 -
@mudge No. 阅读该方法的规范:
some implementations of InputStream will return the total number of bytes in the stream, many will not。这意味着available方法可以或多或少地返回它想要的任何值。
标签: java sockets inputstream bufferedinputstream