我正在使用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);
}
}
[...]
我认为在这段代码中的某个地方存在一个我无法获得的瓶颈。
如何最大限度地提高下载速度?
答案 0 :(得分:1)
问题是缓冲区大小。将缓冲区大小从byte[4096]
增加到byte[256000]
可显着提高下载速度。此外,我通过使其在自己的线程中运行来减少包含进度条更新的while ((bytesRead = is.read(buffer)) != -1)
循环内的I / O操作。
致@Joachim Isaksson在上述评论中指出了缓冲瓶颈。