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



我写了简单的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

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

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

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

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

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

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

最新更新