我正在获取数据,给定一个 URL,并尝试了这里描述的几种方法:How to download and save a file from Internet using Java?
我们的下载速度至少为 2 MB/s,所以看到文件下载速度看起来像 56 KB/s 有点不舒服。使用浏览器,我们可以在几秒钟内抓取一个 50 MB 的文件,但是使用上述方法需要几分钟。
我如何利用我们拥有快速连接这一事实?我正在开发的应用程序远程获取数据以进行每日更新,数据通常在 10-100 MB 范围内,因此如果我们能够快速执行更新例程就太好了。
最佳答案
使用 Java NIO(如以下示例所示):
URL website = new URL("http://cachefly.cachefly.net/100mb.test");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("test.test");
long x = System.currentTimeMillis();
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
System.out.println(System.currentTimeMillis()-x);
...导致我的下载时间为 25 秒 - Chrome 花费了(几乎)完全相同的时间。如果您在任何“普通”操作系统(Windows、Mac、Linux)上运行,那么上述内容将使用文件系统缓存,这意味着它应该与执行相同作业的“ native ”应用程序一样快(因为它是,至少对我来说。)
请注意,使用一个简单的循环来复制字节(pre-nio 方法)会慢很多,因为它不使用缓存 - 所以一定要使用上面的方法来获得最快的速度.
如果您使用上述方法看到截然不同的时间,那么我建议问题出在其他地方 - 例如,某些外部限制了 Java 进程的带宽(也许有一些奇怪的外部安全策略应该受到指责?)我当然不会正如您在此处使用上面的代码所看到的那样,您不会看到任何显着的速度下降。
关于java - 利用完整的网络容量下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16695347/