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());
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值