3

嗨,我正在开发一个下载工具,我发现下载速度太慢了。我已经检查过下载速度看起来很慢。我的代码如下,

        float fileSize = Float.parseFloat(uc.getHeaderField("Content-Length"));

        in = new BufferedInputStream(uc.getInputStream());

        System.out.println("File size : " + fileSize);


        fout = new FileOutputStream(settingsForm.downloadDirectoryText.getText() + File.separatorChar + fileName);
        int BUFFER_SIZE = 10240;
        byte data[] = new byte[BUFFER_SIZE];
        int count = 0;
        int totalDownloaded = 0;

        long downloadStartTime = System.currentTimeMillis();
        long remainingTime = 0;



        while ((count = in.read(data, 0, BUFFER_SIZE)) != -1) {

            totalDownloaded += count;
            long elapsedTime = System.currentTimeMillis() - downloadStartTime;

            float speedInBytes = 1000f * totalDownloaded / elapsedTime;
            float tmpSpeed = speedInBytes;
            if (tmpSpeed > 1024) {
                tmpSpeed = tmpSpeed / 1024;
            }
            if (tmpSpeed > 1024 * 1024) {
                tmpSpeed = tmpSpeed / (1024 * 1024);
            }
            System.out.println("Speed : " + tmpSpeed);
            System.out.println("Remaining Time : " + (fileSize - totalDownloaded) / speedInBytes + " seconds");
            int downloadPercentage = (int) ((totalDownloaded / fileSize) * 100);

            fout.write(data, 0, count);
        } 

我发现下载需要 90 秒,平均下载速度为 60-70kbps。

我已将下载链接提供给免费下载管理器,该管理器可在 10 秒内下载相同的文件。它可以以超过 400kpbs 的下载速度下载相同的文件。

为什么我不能以这么快的速度下载?

我的代码有什么问题吗?

提前致谢。

4

1 回答 1

3

即使没有修改,您的代码也应该比 60 KB/s 快得多。您可以添加 BufferedWriter,但差异可以忽略不计。您使用更快的方法来复制:使用字节缓冲区读/写。当您使用 read() 方法(每个字符读取一个字符)时,BufferedReader 会增加速度。然而缓冲区的大小可以改善这个过程,我用 64 * 1024 有很好的结果。

您还可以删除您的 if (tmpSpeed > 1024 ... 并替换为 (no 'if' is required here):

double tmpSpeed = speedInBytes / 1024;

我已经在我的机器上从一个 HD 到另一个 HD 测试了我们的程序,我用 1GB 的文件获得了以下速度:

21057ms
49797 KB/s  >>> 60 KB/s

这不是你的代码问题,慢来自网络。尝试使用来自不同服务器的不同文件等...

于 2013-04-24T08:29:17.917 回答