所谓的实时下载速度也是按秒计算的,直接每秒计算一下当前下载量与上次记录的下载量便可得到从
上一秒到这一秒的下载数据量,这样实时下载速度就得出来了,至于剩余时间,可以将当前下载的数
据量与耗用的秒为单位的时间进行计算,然后通过需要下载的数据大小来预估剩余时间,公式这样:
剩余时间(秒)=须下载数据总大小/(当前耗用时间(秒)/当前下载大小)
然后把剩余时间转换一下格式就可以得到分钟、小时、天等信息了
在VC中我们可以这样弄:
设置定时器,固定时间统计下载的数据量,从而得到下载速度,然后用当前的速度估算未来需要耗费的时间。
定时器:1s
文件大小:Size
已下载的部分:Downloaded
前一秒已下载的部分:Downloaded_old
剩余时间:(Size – DownLoad) / (Downloaded – Downloaded_old)
一般我们做下载器时,下载速度都不会选择平均下载速度,而是选择实时下载速度!
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class Speed {
private static int count = 0;
private static int lastCount = 0;
private static long lasttime=new Date().getTime();
public static void main(String[] args) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
try {
getSpeed001();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
// 按下载量加1所花费的时间来算
getSpeed002();
}
// 按下载量加1所花费的时间来算
private static void getSpeed002() throws InterruptedException {
// 直接每秒计算一下当前下载量与上次记录的下载量便可得到从上一秒到这一秒的下载数据量,这样实时下载速度就得出来了
while (true) {
int time=1;
int key = new Random().nextInt(100);
//System.out.println(key);
int mod = key % 7;
switch (mod) {
case 0:
time= 1;
break;
case 1:
time= 1;
break;
case 2:
time= 2;
break;
case 3:
time= 3;
break;
case 4:
time= 4;
break;
case 5:
time= 5;
break;
case 6:
time= 6;
break;
default:
break;
}
Thread.sleep(time*1000);
long nowtime=new Date().getTime();
count++;
long taketime = nowtime - lasttime;
System.out.println("getSpeed002,speed=" + taketime/1000);
lasttime=nowtime;
}
}
// 按1s下载量来计算。
private static void getSpeed001() throws Exception {
TimerTask timerTask_speed = new TimerTask() {
@Override
public void run() {
int speed = count - lastCount;
System.out.println("getSpeed001,count=" + count + ",lastCount=" + lastCount
+ ",speed=" + speed);
lastCount = count;
}
};
Timer timer_speed = new Timer();
timer_speed.schedule(timerTask_speed, 0, 1000);// 1s判断一次。计算实时速度,
// 直接每秒计算一下当前下载量与上次记录的下载量便可得到从上一秒到这一秒的下载数据量,这样实时下载速度就得出来了
while (true) {
Thread.sleep(1000);// 每秒下载5
int key = new Random().nextInt(100);
//System.out.println(key);
int mod = key % 7;
switch (mod) {
case 0:
count += 0;
break;
case 1:
count += 1;
break;
case 2:
count += 2;
break;
case 3:
count += 3;
break;
case 4:
count += 4;
break;
case 5:
count += 5;
break;
case 6:
count += key;
break;
default:
break;
}
}
}
}