使用Java通过http批量下载图像的好方法
我们有一个web应用程序,需要通过http从合作伙伴站点导入10-20个图像。如果我有一个字符串列表,表示我要下载的URL,有人对如何尽快下载它们有什么建议吗 我可以把它们放在一个for循环中,但是如果有一个简单的方法来并行化它,它可能会对最终用户有好处。我希望避免使用直接的Java线程,尽管executor框架可能是一个好主意使用Java通过http批量下载图像的好方法,java,multithreading,download,executor,Java,Multithreading,Download,Executor,我们有一个web应用程序,需要通过http从合作伙伴站点导入10-20个图像。如果我有一个字符串列表,表示我要下载的URL,有人对如何尽快下载它们有什么建议吗 我可以把它们放在一个for循环中,但是如果有一个简单的方法来并行化它,它可能会对最终用户有好处。我希望避免使用直接的Java线程,尽管executor框架可能是一个好主意 有什么想法吗?Executor框架正是您想要的。特别是ExecutorCompletionService。使用此功能,您将能够以任意顺序快速提交请求。然后,您将完全按照
有什么想法吗?Executor框架正是您想要的。特别是ExecutorCompletionService。使用此功能,您将能够以任意顺序快速提交请求。然后,您将完全按照完成的顺序检索它们(与提交顺序相反)。这是我的看法。(免责声明:我是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());
}
}
}
package us.monoid.web.parallel;
导入java.io.File;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.Callable;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
导入us.monoid.web.Resty;
公共类下载程序{
公共静态void main(字符串[]args)引发InterruptedException、ExecutionException{
ExecutorService池=Executors.newFixedThreadPool(10);
列表任务=新的ArrayList(args.length);
for(最终字符串url:args){
tasks.add(newcallable()){
公共文件调用()引发异常{
返回新的Resty();
}
});
}
列表结果=pool.invokeAll(任务);
对于(未来ff:结果){
System.out.println(ff.get());
}
}
}
使用Resty库图像可以下载自定义名称,如下所示
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();
}
试试看{
ExecutorService池=Executors.newFixedThreadPool(Names.size());
列表任务=新的ArrayList(Names.size());
for(最终字符串url:url){
tasks.add(newcallable()){
公共文件调用()引发异常{
文件f=新文件(目录+iimage);
返回新的Resty().bytes(url).save(f);
}
});
i++;
}
i=0;
列表结果=pool.invokeAll(任务);
对于(未来ff:结果){
System.out.println(ff.get());
}
}捕获(执行例外){
//TODO自动生成的捕捉块
失败++;
e、 printStackTrace();
}
如果我不想更改图像名称,是否可以?我想使用与URL中相同的名称。