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输出)。