2

Java 中的套接字编程什么InputStream.available()时候有用?BufferedInputStream.available()

4

1 回答 1

4

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

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

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

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

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

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

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

于 2012-08-22T23:33:59.483 回答