public static void main(String[] args) {
// TODO Auto-generated method stub
//初始化100个需要下载的图片源数据
List<ProductInfo> resultlist=new ArrayList<ProductInfo>();
for(int i=0;i<100;i++){
ProductInfo info=new ProductInfo();
info.setId(i);
info.setName("image"+i+".gif");
info.setScore_link("http://www.baidu.com/img/baidu_sylogo1.gif");
list.add(info);
}
//实例化一个线程池
CompletionService<ProductInfo> completionService = new ExecutorCompletionService<ProductInfo>(executorService);
for(int j=0;j<list.size();j++){ProductInfo pinfo=list.get(j);
Task task=new Task(pinfo);
//启动线程,执行任务
}
doOtherTing();
//获取下载完成的图片
try {
Future<ProductInfo> infoFuture = completionService.take();
ProductInfo info2=infoFuture.get();
System.out.println(info2.getLink());
resultlist.add(info2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class ProductInfo {
private int id;
private String name;
private String score_link;
private String link;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public String getScore_link() {
return score_link;
}
public void setScore_link(String score_link) {
this.score_link = score_link;
}
public void setName(String name) {
this.name = name;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}
public class Task implements Callable<ProductInfo>{
private ProductInfo info;
public Task(ProductInfo info){
this.info=info;
}
@Override
public ProductInfo call() throws Exception {
// TODO Auto-generated method stub
System.out.println(info.getId()+"正在执行");
String url = info.getScore_link();
byte[] btImg = getImageFromNetByUrl(url);
if(null != btImg && btImg.length > 0){
System.out.println("读取到:" + btImg.length + " 字节");
String fileName = info.getName();
writeImageToDisk(btImg, fileName);
info.setLink("http://localhost:8080/media/pic/upload/"+fileName);
}else{
System.out.println("没有从该连接获得内容");
}
return info;
}
/**
* 将图片写入到磁盘
* @param img 图片数据流
* @param fileName 文件保存时的名称
*/
public static void writeImageToDisk(byte[] img, String fileName){
try {
File file = new File("D:\\apache-tomcat-8.0.35\\apache-tomcat-8.0.35\\webapps\\media\\pic\\upload\\" + fileName);
FileOutputStream fops = new FileOutputStream(file);
fops.write(img);
fops.flush();
fops.close();
System.out.println("图片已经写入到C盘");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据地址获得数据的字节流
* @param strUrl 网络连接地址
* @return
*/
public static byte[] getImageFromNetByUrl(String strUrl){
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
byte[] btImg = readInputStream(inStream);//得到图片的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 从输入流中获取数据
* @param inStream 输入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}