2011-05-23 11 views
5

Tenemos una aplicación web que necesita importar 10-20 imágenes de un sitio asociado a través de http. Si tengo una lista de cadenas que representan las URL que quiero descargar, ¿alguien tiene alguna sugerencia de cómo descargarlas lo más rápido posible?Una buena manera de descargar imágenes a granel a través de HTTP con Java

Sólo les podría poner en un bucle pero si hay una forma sencilla de paralelizar esta sería probablemente sería bueno para el usuario final. Me gustaría evitar el uso de hebras Java directas, aunque el marco ejecutor podría ser una buena idea.

¿Alguna idea?

Respuesta

1

marco El Ejecutor es exactamente lo que quiere. Específicamente, el ExecutorCompletionService. Al usar esto, podrá enviar solicitudes rápidamente y en cualquier orden. Luego, los recuperará exactamente cuando terminaron (a diferencia de la orden de envío).

5

Aquí está mi utilizar Resty. (DESCARGO DE RESPONSABILIDAD: soy el autor de Resty) Descarga todas las URL dadas en la línea de comando e imprime los nombres de los archivos.

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()); 
     } 
    } 

} 
+0

es posible si no quiero cambiar el nombre de la imagen? Quiero usar el mismo nombre que está en la URL. –

0

El uso de imágenes Biblioteca Resty se pueden descargar con nombres personalizados de la siguiente manera

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(); 

    } 
Cuestiones relacionadas