3

我正在获取数据,给定一个 URL,并尝试了这里描述的几种方法:如何使用 Java 从 Internet 下载和保存文件?

我们的下载速度至少为 2 MB/s,因此看到文件以 56 KB/s 的速度下载有点令人不适。使用浏览器,我们可以在几秒钟内抓取一个 50 MB 的文件,但使用上述方法需要几分钟。

我如何利用我们拥有快速连接的事实?我正在开发的应用程序远程获取数据以进行日常更新,并且数据通常在 10-100 MB 范围内,因此如果我们能够快速执行更新程序会很好。

4

1 回答 1

5

使用 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)上运行,那么上面将使用文件系统缓存,这意味着它应该与执行相同作业的“本机”应用程序一样快(因为它是,至少对我来说。)

请注意,使用简单的循环复制字节(pre-nio 方法)会慢得多,因为它不使用缓存 - 所以一定要使用上述方法来获得最快的速度。

如果您使用上述方法看到完全不同的时间,那么我建议问题出在其他地方 - 例如,Java 进程的外部限制带宽(也许有一些奇怪的外部安全策略要归咎于?)我当然没有看到正如您在上面的代码中看到的那样,任何显着的速度下降。

于 2013-05-22T15:18:29.127 回答