InputStream.available() 什么时候有用?

mud*_*dge 3 java sockets

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

Ste*_*n C 5

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

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

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

  • 在套接字情况(以及类似的情况)中,available()如果结果为零,该方法并不会真正告诉您是否读取。如果你做出了错误的选择,你要么会在无意中阻塞,要么永远不会发现套接字实际上已经关闭。其中任何一个都可能很糟糕。

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

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

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

  • @mudge 仅当底层流支持时。如果是 SSLSocket,它仍然可以返回零。 (2认同)