2012-08-22 45 views
2

什么时候是InputStream.available()BufferedInputStream.available()在Java的socket编程中有用?什么时候InputStream.available()有用?

+2

如果在没有可用输入时调用阻塞的'read'方法会发生什么? “available”的文档说什么? -1,因为没有显示任何先前的研究,也没有给出任何上下文(例如,包括来自文档或经验的某些内容或者*当前问题*以进一步优化问题)。另请注意,InputStream是* abstract *。 – 2012-08-22 23:22:14

+0

返回可从此输入流读取(或跳过)的字节数的估计值,而不会因为此输入流的下一次方法调用而被阻止。下一次调用可能是同一个线程或另一个线程。 http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available() – kosa

+1

您从文档中无法获得的任何特定措词? – kosa

回答

3

我的看法是,除非你知道“估计”有多好,否则这种方法是无用的。在连接到插座的情况下,估计在任何情况下都不可靠。

问题是该方法的返回值并没有区分套接字上到达流结束的情况,也没有在套接字上可用的字符当前,但可能会传递更多字符。根据javadoc,两者都可以归零。

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

  • 在插座的情况下(以及类似的),该available()方法并没有真正告诉你是否读取或没有,如果结果是零。而如果你做出了错误的选择,你会在你不想要的时候阻止,或者从未发现套接字已经关闭。其中任何一个都可能是坏的。

  • 在其他情况下(如从本地文件读取),也有发现读取是否有可能阻止其他方式。此外,阅读不太可能阻止很长时间,所以在避免阻止方面通常没有多大意义。

  • 最后,在某些情况下,我认为你可以得到一个非零响应,并具有读取调用块呢。 (我想在远程安装的文件系统的文件...和远程服务器冻结的可能性,当你尝试读取。)

的底线是available()记录为返回一个估计。 javadoc并不保证在所有可能的情况下估算的可靠程度如何,实际上在某些情况下估算不准确,因为这需要了解远程服务器将要做什么。

+0

”单个读取或跳过这么多字节不会被阻塞,但可能会读取或跳过更少的字节。“ < - 这是我以前用过的东西。那么,没用?不为。 (虽然一些执行者*只*返回0所以..) – 2012-08-22 23:37:38

+0

@pst:我想你的观点是你不能真正依赖任何给定的实现给你回有用的东西。在你的程序中,它将如何处理始终返回0的InputStream?你永远不会读它吗? –

+0

@MarkPeters我会知道我正在处理的实现。尽可能多的乐趣,因为它很好,相信一个接口或抽象类可以捕获所有不同的来源/体系结构中的所有东西..老实说,虽然对于“套接字”,我会使用NIO(或更好,它的包装)。 – 2012-08-22 23:39:56