当前位置: 代码迷 >> J2SE >> URLConnection下载文件时,如何在不严重影响性能的前提下实时统计下载量
  详细解决方案

URLConnection下载文件时,如何在不严重影响性能的前提下实时统计下载量

热度:62   发布时间:2016-04-23 20:05:39.0
URLConnection下载文件时,怎么在不严重影响性能的前提下实时统计下载量
最近在做一个小项目,想实现边下载文件边显示下载进度的功能,其实我已经实现了,但是我感觉我这种做法严重地影响了性能。
          我的做法是这样的,我通过多次调用setRequestProperty()方法来一段一段的获取输入流,而且每获取一次输入流,就写一次文件,然后就能统计一次下载量,代码如下:
con = url.openConnection();
con.setAllowUserInteraction(true);
// 设置当前线程下载的起点,终点
con.setRequestProperty("Range", "bytes=" + startPosition + "-"
+ endPosition);

           我为了能即时的显示下载进度,所以把每次获取的字节数设得很小,仅4kB,也就是上面的代码的endPosition-startPosition=4kB,这样一来,我的功能是实现了,但是发现下载速度很慢,我用笔记本开的服务器,用手机连笔记本开的wifi来下载音乐只有200KB/s的速度,但是我以前用一次性下完再写文件的方法下载有2MB/s的速度。我找了一下原因,怀疑是我每下载4KB就要重新打开一次连接的原因,本来我以为只要调用一次
con = url.openConnection();
就能不断的调用
con.setRequestProperty("Range", "bytes=" + startPosition + "-"
+ endPosition);

但是这样就报错了,必须重新打开一次连接。
           重点来了,下载文件的过程实际上是这句代码吧:
con.getInputStream()

相信这是个漫长的过程,但是我们好像必须在这句代码执行完了以后才能统计一次下载量,求大神告诉我,有没有办法在这个方法执行的同时我们能够一边统计下载量?或者大神有没有什么高招来实现我的边下载边即时统计下载量,而且对性能影响不那么大。【另外我们先不考虑多线程下载,因为我把多线程用在了同时下载多个文件上,每个文件就暂且给它一个线程吧】
------解决思路----------------------
怎么可以这样做呢,这样做性能肯定大大受影响的啊。你这相当于需要连接服务器很多次啊。

你可以先获得文件的大小,然后一次性下载,在下载的过程中,通过已经读取流的字节数/文件大小不就等于你下载的百分比了。
------解决思路----------------------
available()返回流总字节数, 读的过程中随时可以计算出当前下载百分比