Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过HttpURLConnection下载时如何提高下载速度?_Java_Download_Httpurlconnection - Fatal编程技术网

Java 通过HttpURLConnection下载时如何提高下载速度?

Java 通过HttpURLConnection下载时如何提高下载速度?,java,download,httpurlconnection,Java,Download,Httpurlconnection,我正在使用HttpURLConnection从我的Web服务器下载*.rar文件。 我添加了一些临时代码行来粗略测量(这是非常不准确的)通过Java/HttpURLConnection运行下载时的下载速度。下载速度大约在400kb/s和2mb/s之间波动 通过我的浏览器(Mozilla FireFox)下载相同的文件,我得到了我的Web服务器所支持的完整的12.5mb/s。使用FireFox,我在大约6秒内下载文件,而Java代码在12-30秒内下载文件 下面是一段经过清理的代码片段,我正在使用

我正在使用
HttpURLConnection
从我的Web服务器下载*.rar文件。 我添加了一些临时代码行来粗略测量(这是非常不准确的)通过Java/
HttpURLConnection运行下载时的下载速度。下载速度大约在400kb/s和2mb/s之间波动

通过我的浏览器(Mozilla FireFox)下载相同的文件,我得到了我的Web服务器所支持的完整的12.5mb/s。使用FireFox,我在大约6秒内下载文件,而Java代码在12-30秒内下载文件

下面是一段经过清理的代码片段,我正在使用它进行测试,只是为了说明尝试下载该文件的方法

[...]

httpConn = (HttpURLConnection) (new URL(downloadURL)).openConnection();
httpConn.setRequestMethod("POST");
httpConn.setRequestProperty("Cookie", cookie);

[...]

try (InputStream is = httpConn.getInputStream(); 
        FileOutputStream fos = new FileOutputStream(targetFile)) {       

    int bytesRead;
    byte[] buffer = new byte[4096];
    while ((bytesRead = is.read(buffer)) != -1) {
        fos.write(buffer, 0, bytesRead);
    }
}

[...]
我假设在这段代码中的某个地方有一个我无法控制的瓶颈


如何最大限度地提高下载速度?

问题在于缓冲区大小。将缓冲区大小从
字节[4096]
增加到
字节[256000]
显著提高了下载速度。此外,我还减少了
while((bytesRead=is.read(buffer))!=-1)
循环中的I/O操作,该循环包含一个进度条更新,方法是让它在自己的线程中运行


归功于@Joachim Isaksson,他在上面的评论中指出了缓冲区瓶颈。

只是想弄清楚,我们说的是12.5MByte/s还是12.5Mbit/s?对不起,12.5MByte/s(100Mbit)。我会尝试将4k缓冲区增加到256k。一个4k缓冲区需要每秒填充3000次才能填充你的链接,这可能是瓶颈。这真的很有帮助!非常感谢,现在我只落后FireFox下载1-2秒(我认为这是由于while()中的I/O输出)。