java - 为什么用Java下载文件速度这么慢

标签 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

最佳答案

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

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

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

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

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

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

关于java - 为什么用Java下载文件速度这么慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6086708/

相关文章:

c++ - 在同一行读取字符串和整数

java - 两个与Java类似的复制代码,两种行为

c - 当我只需要一个输入时,为什么 getchar() 需要两个输入?

java - FileWriter 未写入其所有内容 - 如何绕过最大值?

c - Raspberry Pi - C 程序不写入文本文件

java - 用按钮单击时的查询替换 jtable 中的先前行 - java swing

java - 在 JSP 中使用隐藏表单持久保存数据

java - 与 Spark Java 的相互身份验证

java - 绑定(bind)异常 : Address already in use even with unique port

java - JPA/EclipseLink 惰性集合未加载