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

How to increase the download speed when downloading via 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);
    }
}

[...]

我假设这段代码中存在我无法理解的瓶颈。

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

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

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