【问题标题】:A good way to bulk download images over http with Java使用 Java 通过 http 批量下载图像的好方法
【发布时间】:2011-05-23 22:56:07
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: java multithreading download executor


    【解决方案1】:

    这是我对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<Callable<File>> tasks = new ArrayList<Callable<File>>(args.length);
            for (final String url : args) {
                tasks.add(new Callable<File>() {
                    public File call() throws Exception {
                        return new Resty().bytes(url).save(File.createTempFile("img", ".png"));
                    }               
                });
            }
            List<Future<File>> results = pool.invokeAll(tasks);
            for (Future<File> ff : results) {
                System.out.println(ff.get());
            }
        }
    
    }
    

    【讨论】:

    • 如果我不想更改图像名称,是否可以?我想使用与 URL 中相同的名称。
    【解决方案2】:

    Executor 框架正是您想要的。特别是 ExecutorCompletionService。使用它,您将能够以任何顺序快速提交请求。然后您将完全按照它们完成的方式检索它们(而不是提交顺序)。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多