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 过去,描述文件大小,然后再循环持续获取流信息。