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

Bos*_*sss 8 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);
}
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

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

Yve*_*tin 5

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

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

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

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

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

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