io 流相关知识之available()方法的使用总结

xiaoxiao2021-02-28  5

先看看API的说明:

[java] view plain copy

1. public int available()    

2.               throws IOException  

[java] view plain copy

1. 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不  

[java] view plain copy

1. 会受阻塞,但读取或跳过的字节数可能小于该数。  

[java] view plain copy

1.      

2. <strong><span style="font-size:18px;">注意:</span></strong>有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。     

3.     

4. 如果已经调用 close() 方法关闭了此输入流,那么此方法的子类实现可以选择抛出 IOException。     

5.     

6.  InputStream 的 available 方法总是返回 0     

7.     

8. <strong>此方法应该由子类重写。</strong>     

9. 返回:    

10. 可以不受阻塞地从此输入流读取(或跳过)的估计字节数;如果到达输入流末尾,则返回 0  

但是在FileInputStream中已经重写了这个方法,重写之后的方法是通过文件的描述来获取文件的大小的。

那么,我们来看看哪些地方可以用available()方法来获取文件大小,进而用来定义缓冲数组的长度。

1.在本地文件文件中,这里我一般是直接使用的。

 2.网络中的文件

       a.比如web 中http 里面的文件流里面,第一种情况有content-length,那么小文件的情况,我们是直接可以通过request 获取该属性,也就知道文件的大小了。

      

       b.在某些情况下,比如文件比较大,采用采用分段方式,长连接的方式发送,不能一次知道文件大小,http 的header 里面就没有上面的content-length 属性,而是变成了Transfer-Encoding: chunked属性,这表示分段发送信息,但是对整个文件的接受,可以通过一些标志位,或者一些超时限制等方法处理,这里不具体研究了。

   

        c.socket 传输文件,这玩意我看了下源码,是没重写available方法的,也就是说我们不能通过这个知道流的字节数,一般情况下,我们可以先发送一段自定义的header 过去,描述文件大小,然后再循环持续获取流信息。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_18882775/article/details/50967033

文章标签: FileInputStreamInputStreamavailable数组大小OutputStream

个人分类: java

转载请注明原文地址: https://www.6miu.com/read-1900225.html

最新回复(0)