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

时间:2016-03-13 20:55:42

标签: java download httpurlconnection

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

通过我的浏览器(Mozilla FireFox)下载相同的文件我得到了我的网络服务器支持的完整的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);
    }
}

[...]

我认为在这段代码中的某个地方存在一个我无法获得的瓶颈。

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

1 个答案:

答案 0 :(得分:1)

问题是缓冲区大小。将缓冲区大小从byte[4096]增加到byte[256000]可显着提高下载速度。此外,我通过使其在自己的线程中运行来减少包含进度条更新的while ((bytesRead = is.read(buffer)) != -1)循环内的I / O操作。

致@Joachim Isaksson在上述评论中指出了缓冲瓶颈。