5

我正在下载一个文件,但也试图确定以 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之间的任何地方。我怎样才能让它给出正确的下载速度?谢谢

4

2 回答 2

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;    
}
于 2012-08-11T06:01:36.513 回答
0

首先,您以非常短的间隔计算read()时间 +write()时间,结果将根据 writes() 的(磁盘缓存)刷新而有所不同。将计算放在read()

第二个之后,您的缓冲区大小(4096)可能与 tcp 缓冲区大小不匹配(您的最终较小),因此某些读取会非常快(因为它是从本地 TCP 缓冲区读取的) . 相应地使用Socket.getReceiveBufferSize() 并设置缓冲区的大小(假设是 TCP recv buf 大小的 2*)并将其填充到嵌套循环中,直到在计算之前填满。

于 2012-08-11T06:28:16.150 回答