java - 利用完整的网络容量下载文件

标签 java

我正在获取数据,给定一个 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/

相关文章:

java - 提交/回滚后对 CMT 的监听器支持

java - 将 RTF 加载到 JTextPane 中

java - 在 Java Maven 项目中指定 logback.xml

java - 使用 AWS Java SDK 获取 CloudWatch 指标?

java - 存储数据库密码的最佳实践

java - 纬度和经度 Java

javascript - 如何使用selenium实现Java循环

使用svn覆盖路径文件导入的java项目

java - 如何使用 Square 的 Retrofit 网络库实现异步回调

java - 如何检查数据库表中的多个shiro权限?