java中FileInputStream与InputStream的available()方法的作用

来源:互联网 发布:电脑软件怎么搬家 编辑:程序博客网 时间:2024/05/17 06:05

available()方法


如果要从网络中下载文件时,我们知道网络是不稳定的,也就是说网络下,read()方法是阻塞的,说明这时我们用inputStream.available()获取不到文件的总大小。
此时就需要通过
HttpURLConnection httpconn = (HttpURLConnection)url.openConnection();
httpconn.getContentLength();//获取文件长度
来获取文件的大小。


对于一般的接口调用,可以使用inputStream.available()方法获取返回值的数据的长度大小  如下:


//建立http连接http.connect();//获取输入流InputStream is = http.getInputStream(); //获取信息的长度int size = is.available(); //创建字节数组用来存储流数据byte[] b = new byte[size];//将流数据读入字节数组中is.read(b);

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

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

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

 2.网络中的文件

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

      

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

   

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




阅读全文
0 0
原创粉丝点击