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

8

我写了一个简单的Java下载器,但是速度有些问题。

一开始,速度还可以 - 就像我使用浏览器下载文件时一样。但是过一段时间后,速度就会大大降低,并且每两秒钟就会变化一次 - 从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);
}

如何最大化下载速度?

更新

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

关于测量:我每隔3秒检查写入了多少字节,然后除以3再除以1024 - 这给出了kb / s。


4
你如何测量你的下载速度?你期望的速度是多少? - coobird
这种测量方式听起来像是基于文件系统实时报告已写入文件的确切字节数,例如响应于“ls”或“dir”命令。我会采取更直接的方法来消除不确定性,将检测工具添加到代码中。 - T.J. Crowder
count的各个值相加如何?这似乎是衡量您已经下载了多少的最佳方法。 - CodesInChaos
速度都不算很快,你更有可能受制于服务器和互联网连接的速度。这些速度对于512Kb的连接来说是正常的。你的速度是多少? - Peter Lawrey
当你从YouTube下载时,这是正常的。YouTube会先以高速提供视频的一部分(这样你就可以开始观看),然后减慢下载速度。 - Martijn Courteaux
1个回答

5
为了提高速度,应用程序应该使用多个连接(而不仅仅是一个),并使用多线程代码,以达到带宽和服务器容量的极限。每个线程创建自己的连接并查询文件的部分。
这样的应用程序示例是IBM下载管理器,它通常使用三个HTTP连接来检索大型文件。大多数FTP客户端也能够使用多个连接来增加吞吐量。在Java中,可以使用Apache HttpClient编写这样的多线程应用程序。
您没有详细说明URL中使用的协议。如果是HTTP,则HEAD请求返回文件长度,使用支持分块的GET查询文件的部分。
如果仍然不满意,请提供更多细节:
  • 你的 "But after a while" 是什么意思,你会连续下载许多文件吗?
  • 什么是协议?你使用特定的URLStreamHandler吗?
  • 你是否检查过JVM内存和垃圾回收的使用情况?
  • 你的工作站可能正在忙于其他事情:CPU使用率,网络带宽被其他东西使用,防病毒软件减慢了磁盘访问速度吗?
  • 你是否通过代理:某些HTTP代理可能会在同一连接上经过一段时间后降低带宽...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接