如何提高通过 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,他在上面的评论中指出了缓冲区瓶颈。
我正在使用 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,他在上面的评论中指出了缓冲区瓶颈。