我正在下载文件,但还尝试以KBps确定下载速度。我提出了一个等式,但它给出了奇怪的结果。
try (BufferedInputStream in = new BufferedInputStream(url.openStream());
FileOutputStream out = new FileOutputStream(file)) {
byte[] buffer = new byte[4096];
int read = 0;
while (true) {
long start = System.nanoTime();
if ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
} else {
break;
}
int speed = (int) ((read * 1000000000.0) / ((System.nanoTime() - start) * 1024.0));
}
}
它给了我100到300,000之间的任何地方。如何才能使下载速度正确?感谢
答案 0 :(得分:2)
您没有检查currentAmmount和previousAmount文件下载。
例如
int currentAmount = 0;//set this during each loop of the download
/***/
int previousAmount = 0;
int firingTime = 1000;//in milliseconds, here fire every second
public synchronyzed void run(){
int bytesPerSecond = (currentAmount-previousAmount)/(firingTime/1000);
//update GUI using bytesPerSecond
previousAmount = currentAmount;
}
答案 1 :(得分:0)
首先,您在非常短的时间间隔内计算read()
时间+ write()
时间,结果将根据写入()的(磁盘缓存)刷新而有所不同。
将计算放在read()
之后
其次,您的缓冲区大小(4096)可能与tcp缓冲区大小不匹配(您的缓冲区大小最终会更小),因此有些读取速度非常快(因为它是从本地TCP缓冲区读取的)。使用Socket.getReceiveBufferSize()
并相应地设置缓冲区的大小(比如说2 * TCP recv buf大小的大小)并在计算之前将其填入嵌套循环直到。