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

时间:2012-08-22 23:19:33

标签: java sockets

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

1 个答案:

答案 0 :(得分:4)

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

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

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

  • 在套接字案例(和类似的案例)中,如果结果为零,available()方法并不真正告诉您是否读取。如果你做出了错误的选择,你会在你不想要的时候阻止,或者永远不会发现套接字实际上已被关闭。其中任何一个都可能不好。

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

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

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