InputStream.available()在Java中做什么?

Alb*_*ore 56 java inputstream blocking

InputStream.available()Java中做什么?我阅读了文档,但我还是无法解决.

医生说:

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

类InputStream的可用方法始终返回0.

阻止是什么意思?它只是意味着同步通话吗?

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

Viv*_*sse 40

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

available()方法告诉您在read()调用将阻止程序的执行流程之前可以读取多少字节.在大多数输入流上,所有调用read()都是阻塞,这就是默认情况下可用返回0的原因.

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

  • BufferedInputStream.available()告诉您可以在不阻塞的情况下读取多少字节.这是缓冲区中已有的字节数和嵌套输入流的avaiable()结果的*sum*.另请注意,对于SSL套接字,available()始终返回零. (8认同)
  • @Cupidvogel:不,对于没有内容的文件,流将立即返回-1以指示没有数据.但是,如果你有一个基于*network*的流,那么连接的另一端保持打开但不发送任何数据,那么这确实会永远阻止. (7认同)

Bri*_*new 29

阻塞与此处的线程或同步无关.相反,它与阻止IO有关(有关详细信息,请参阅内容).如果您发出读取请求,并且该通道没有可用,则阻塞调用将等待(或阻止),直到数据可用(或通道关闭,抛出异常等)

为什么要使用available()?因此,您可以确定要读取的字节数,或确定是否要阻止.

请注意,Java也具有非阻塞IO功能.有关详细信息,请参见此处

  • 这个答案是不正确的.阻止调用将在*no*数据可用时阻塞.如果你要求四个,有三个,你就得到三个. (10认同)