InputStream.available() 在 Java 中做了啥?

Posted

技术标签:

【中文标题】InputStream.available() 在 Java 中做了啥?【英文标题】:What does InputStream.available() do in Java?InputStream.available() 在 Java 中做了什么? 【发布时间】:2011-04-11 08:33:25 【问题描述】:

InputStream.available()Java 中做了什么?我阅读了文档,但仍然无法理解。

文档说:

返回可以从此输入流中读取(或跳过)的字节数,而不会被此输入流的方法的下一个调用者阻塞。下一个调用者可能是同一个线程或另一个线程。

InputStream 类的可用方法总是返回 0。

阻塞是什么意思?它只是意味着同步调用吗?

最重要的是,available() 方法的目的是什么?

【问题讨论】:

available() 真正有用的用途很少。其中之一是用于从系统中读取。 【参考方案1】:

在 InputStreams 中,read() 调用被称为“阻塞”方法调用。这意味着如果在方法调用时没有数据可用,该方法将等待数据可用。

available() 方法告诉您可以读取多少字节,直到read() 调用将阻塞您的程序的执行流程。在大多数输入流中,所有对 read() 的调用都是阻塞的,这就是为什么 available 默认返回 0。

但是,在某些流(例如BufferedInputStream,具有内部缓冲区)上,会读取一些字节并将其保存在内存中,因此您可以在不阻塞程序流的情况下读取它们。在这种情况下,available() 方法会告诉您缓冲区中保留了多少字节。

【讨论】:

BufferedInputStream.available() 告诉您可以在不阻塞的情况下读取多少字节。这是缓冲区中已有字节数的 sum 和嵌套输入流的avaiable() 结果。另请注意,对于 SSL 套接字,available() 始终返回零。 我不太明白知道这个有什么用途。我真的,看不出我为什么要关心,即我看不到在 mu 应用程序中的何时何地我可以找到它的用处。当然,很明显,我很无知,但那是因为我缺乏经验。 正如我上面所说,有用的用途很少。你必须知道你正在处理一个将提供非零答案的流,然后你必须使用结果。 您能否解释一下如果在方法调用时没有可用数据,该方法将等待数据可用是什么意思?假设我有一个没有内容的文件。如果我在FileInputStream 中调用它,它会永远等待来自文件的数据吗?这是否意味着在原始代码中调用流之后的任何内容都将被无限期搁置? @Cupidvogel:不,对于没有内容的文件,流将立即返回 -1 以指示没有数据。但是,如果您有一个基于 network 的流,而连接的另一端保持它打开但不发送任何数据,那么这确实会永远阻塞。【参考方案2】:

这里的阻塞与线程或同步无关。相反,它与阻塞 IO 相关(有关更多信息,请参阅this)。如果您发出读取请求,但通道没有可用的,阻塞调用将等待(或阻塞)直到数据可用(或通道关闭,抛出异常等)

那么为什么要使用 available() 呢?因此,您可以确定要读取多少字节,或者确定是否要阻塞。

请注意,Java 也具有非阻塞 IO 功能。详情请见here

【讨论】:

我偶然发现了这个问题,现在我想知道,我可以使用 available() 来解决我自己的问题,而无需求助于 NIO。我的问题:***.com/questions/3867042/… 这个答案不正确。当有 no 数据可用时,阻塞调用将阻塞。如果您要四个并且有三个,那么您会得到三个。

以上是关于InputStream.available() 在 Java 中做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

关于InputStream类的available()方法

File available()方法

Java中InputStream和String之间的转换方法

Java中InputStream和String之间的转换方法

从 InputStream 读取时,Android Socket BufferedReader readLine() 不起作用

Java IO 流