【问题标题】:When is InputStream.available() useful?InputStream.available() 什么时候有用?
【发布时间】:2012-08-18 10:37:04
【问题描述】:

InputStream.available()BufferedInputStream.available() 在 Java 中的套接字编程中何时有用?

【问题讨论】:

  • 如果在没有可用输入的情况下调用阻塞的read 方法会发生什么? available 的文档是怎么说的? -1 因为没有显示先前的研究并且没有给出上下文(例如,包括来自文档或经验或当前问题感兴趣的内容以进一步完善问题)。还要注意 InputStream 是 abstract.
  • 返回对可以从此输入流读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。下一次调用可能是同一个线程或另一个线程。 docs.oracle.com/javase/6/docs/api/java/io/…
  • 任何您无法从文档中获得的具体措辞?
  • 我的意思是有人使用它的例子是什么?

标签: java sockets


【解决方案1】:

我的看法是,除非您知道“估计”有多好,否则该方法没有用处。并且在流连接到套接字的情况下,估计不能在所有情况下都是可靠的。

问题在于该方法的返回值无法区分您已经到达套接字上的流末尾的情况,以及套接字上没有可用字符当前的情况,但更多可能交付。根据 javadoc,两者都可以返回零。

这种不确定性使该方法几乎毫无用处。

  • 在套接字情况下(和类似情况),available() 方法并不会真正告诉您是否读取结果是否为零。而且,如果您做出错误的选择,您将在您不打算这样做时阻塞,或者永远不会发现套接字实际上已关闭。其中任何一个都可能是坏的。

  • 在其他情况下(例如从本地文件读取),还有其他方法可以确定读取是否可能阻塞。此外,无论如何,读取不太可能长时间阻塞,因此避免阻塞通常没有多大意义。

  • 最后,在某些情况下,我认为您可能会得到一个非零响应并且无论如何都会有读取调用块。 (我正在考虑远程安装的文件系统上的文件......以及当您尝试读取时远程服务器冻结的可能性。)

底线是available() 被记录为返回一个估计。 javadoc 不保证该估计在所有可能的情况下的可靠性,而且确实在某些情况下估计不准确,因为这需要知道远程服务器将要做什么。

【讨论】:

  • "单次读取或跳过这么多字节不会阻塞,但可能会读取或跳过更少的字节。" only返回0所以..)
  • @pst:我想关键是你不能真正依赖任何给定的实现来给你任何有用的东西。在您的程序中,它将如何处理始终返回 0 的 InputStream?你永远不会读它吗?
  • @MarkPeters 我会知道我正在处理的实现。相信接口或抽象类可以捕获所有不同源/架构中的所有内容,这很有趣。老实说,尽管对于“套接字”,我会使用 NIO(或者更好的是,它的包装器)。
  • @pst:这是一种错误的困境。 InputStream 确实适用于所有环境,如果您不依赖规范调用为特定于实现的东西。我同意你的看法......如果你想要非阻塞 I/O,请使用 NIO。
  • @mudge 仅当底层流支持它时。如果是 SSLSocket,它仍然可以返回零。
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 2012-08-07
  • 2012-04-05
  • 1970-01-01
  • 2011-09-06
  • 2010-12-26
  • 1970-01-01
  • 2011-05-06
相关资源
最近更新 更多