如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调用这个函数是在下载文件或者对文件进行其他处理时获取文件的总大小。
以前在我们初学File和inputStream和outputStream时,有需要将文件从一个文件夹复制到另一个文件夹中,这时候我们用的就是inputStream.available()来获取文件的总大小,而且屡试不爽。
但是当我们要从网络URL中下载一个文件时,我们发现得到的数值并不是需要下载的文件的总大小。
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数
所以说要从网络中下载文件时,我们知道网络是不稳定的,也就是说网络下载时,read()方法是阻塞的,说明这时我们用
inputStream.available()获取不到文件的总大小。
网络下载获取文件总大小的代码:
- HttpURLConnection httpconn = (HttpURLConnection)url.openConnection();
- httpconn.getContentLength();
我们再来看看httpconn.getContentLength();
- /**
- * Gets the content length in bytes specified by the response header field
- * {@code content-length} or {@code -1} if this field is not set.
- *
- * @return the value of the response header field {@code content-length}.
- * @since Android 1.0
- */
- public int getContentLength() {
- return getHeaderFieldInt("Content-Length", -1);//$NON-NLS-1$
- }
意思是从http预解析头中获取“Content-length”字段的值
其实也是类似从文件描述符中获取文件的总大小