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