为什么使用Java下载文件的速度如此之低

时间:2011-05-22 07:45:51

标签: java io

我编写了简单的Java Downloader,我在速度方面遇到了一些问题。

首先,速度还可以 - 就像我使用浏览器下载此文件一样。但经过一段时间后,速度会下降很多,并且每两秒钟更换一次 - 从42kb / s到64kb / s,从64kb / s到42kb / s。

我的代码:

InputStream is = null;
FileOutputStream os = null;
os = new FileOutputStream(...);
URL u = new URL(...);
URLConnection uc = u.openConnection();
is = uc.getInputStream();
final byte[] buf = new byte[1024];
for(int count = is.read(buf);count != -1;count = is.read(buf)) {
    os.write(buf, 0, count);
}

我应该怎样做才能最大限度地提高下载速度?

更新

文件大小从1到大约100MB不等。 我将缓冲区增加到65536,它是相同的。

关于测量:我每3秒检查写入多少字节,然后除以3和1024 - 它给我kb / s

1 个答案:

答案 0 :(得分:5)

为了提高速度,最高可达带宽和服务器容量的限制,应用程序应使用多线程代码的多个连接(不止一个):每个线程创建自己的连接并查询文件的某些部分。

此类应用程序的一个示例是IBM download director,它通常使用三个HTTP连接来检索大文件。大多数FTP客户端也能够使用多个连接来提高吞吐量。在Java中,Apache HttpClient可用于编写这样的多线程应用程序。

您尚未详细说明网址中使用的协议。如果HTTP,HEAD请求返回文件长度,GET使用分块支持来查询文件部分。

如果直接使用HttpURLConnection并为ChunkedStreamingMode设置值,即使使用单个连接,也可以获得更好的性能。

如果仍然不满意,请提供其他详细信息:

  • 你的“但过了一会儿”的意思是,你按顺序下载了很多文件吗?
  • 协议是什么?你使用特定的URLStreamHandler吗?
  • 您检查过JVM内存和垃圾回收的使用情况吗?
  • 您的工作站可能正忙于做其他事情:使用CPU,其他东西使用的网络带宽,防病毒减慢磁盘访问速度?
  • 您是否通过代理:某些HTTP代理可能会在同一连接上几分钟后减少带宽......