Хороший способ массовой загрузки изображений через http с Java - PullRequest
5 голосов
/ 24 мая 2011

У нас есть веб-приложение, которому нужно импортировать 10-20 изображений с партнерского сайта через http.Если у меня есть список строк, представляющих URL-адреса, которые я хочу загрузить, есть ли у кого-нибудь предложение о том, как загрузить их как можно быстрее?

Я мог бы просто поместить их в цикл for, но если естьпростой способ распараллелить это, вероятно, будет хорошо для конечного пользователя.Я хотел бы избежать использования прямых потоков Java, хотя структура executor может быть хорошей идеей.

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 24 мая 2011

Вот мой дубль, используя 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());
        }
    }

}
1 голос
/ 24 мая 2011

Фреймворк Executor - это именно то, что вы хотите.В частности, ExecutorCompletionService.Используя это, вы сможете отправлять запросы быстро и в любом порядке.Затем вы получите их в точности так, как они были выполнены (в отличие от порядка отправки).

0 голосов
/ 11 ноября 2013

С помощью 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();

    }
...