java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > InputStream.available()获取流大小问题

解决InputStream.available()获取流大小问题

作者:码农的进阶之路

这篇文章主要介绍了解决InputStream.available()获取流大小问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

InputStream.available()获取流大小问题

近日在学习IOUtils时,模拟从网络上读取数据存放到本地磁盘,想使用InputStream.available()查看流的大小,结果发现得到的大小跟实际生成文件的大小不一致。

上代码:

InputStream in = new URL("http://www.apache.org").openStream();  
System.out.println(in.available()); 
FileOutputStream out = new FileOutputStream("F://1.html");  
//这里返回的i可以认为是流的大小
int i = IOUtils.copy(in, out); 
System.out.println(i);  
IOUtils.closeQuietly(out); 
IOUtils.closeQuietly(in); 

输出结果:

10660
60787

很显然,按照我们之前的理解,这两个输出得到的数据应该是一样的。后一个输出的文件大小是没有问题的,写入到硬盘上就是那么多字节。那么前一个输出的问题到底在哪呢?

通过查看api,发现了些端倪。该方法的描述是这样的:返回可以不受阻塞地从此文件输入流中读取的字节数

如上,由于是从网络中获取数据,由于存在着网络延迟等因素,所以也就不难理解 两次输出不一致了。

当然,如果是读取本地文件的话,这个方法返回的数据大小一般是真实的。因此,如何使用以及要不要用这个方法,得根据具体的场景

若想获取网络中流的总大小,可以借助URLConnection方法

URLConnection openConnection = new URL("http://www.apache.org").openConnection(); 
System.out.println(openConnection.getContentLength());

InputStream.available()使用大坑

问题场景

文件下载功能,需要对原来的文件进行读取再输出到文件或浏览器中,会常用到InputStream.available()方法。

经历过一次系统功能变更升级,需要将文件先下载到本地再响应出去,发现下载的文件不全

百思不得其解,搜索好久资料,查找得知,以备忘记

这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。

所以在进行网络数据传输时候,不能使用InputStream.available(),这个方法导致系统出现长时间暂停状态

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文