使用Java批量下载图像的好方法

我们有一个Web应用程序需要通过http从合作伙伴站点导入10-20个图像。 如果我有一个表示我想下载的url的字符串列表,是否有人建议如何尽快下载它们?

我可以把它们放在for循环中,但是如果有一种简单的方法来并行化这对最终用户来说可能是好的。 我想避免使用直接的Java线程,尽管执行程序框架可能是个好主意。

有任何想法吗?

Executor框架完全符合您的要求。 特别是ExecutorCompletionService。 使用此function,您将能够以任何顺序快速提交请求。 然后,您将完成它们完成后检索它们(而不是提交订单)。

这是我使用Resty的看法 。 (免责声明:我是Resty的作者)下载命令行中给出的所有URL并打印出文件名。

package us.monoid.web.parallel; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import us.monoid.web.Resty; public class Downloader { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService pool = Executors.newFixedThreadPool(10); List> tasks = new ArrayList>(args.length); for (final String url : args) { tasks.add(new Callable() { public File call() throws Exception { return new Resty().bytes(url).save(File.createTempFile("img", ".png")); } }); } List> results = pool.invokeAll(tasks); for (Future ff : results) { System.out.println(ff.get()); } } } 

使用Resty Library图像可以使用自定义名称下载,如下所示

 try { ExecutorService pool = Executors.newFixedThreadPool(Names.size()); List> tasks = new ArrayList>(Names.size()); for (final String url : Urls) { tasks.add(new Callable() { public File call() throws Exception { File f=new File(directory+iimage); return new Resty().bytes(url).save(f); } }); i++; } i=0; List> results = pool.invokeAll(tasks); for (Future ff : results) { System.out.println(ff.get()); } } catch (ExecutionException e) { // TODO Auto-generated catch block fails++; e.printStackTrace(); }