你的位置:首页 > Java教程

[Java教程]基于Java实现批量下载网络图片


昨天朋友做项目遇到一个需求,需要把上千个的微博表情图片下载到本地磁盘,并做好规范命名,塞给我一堆Json数据,让我帮忙处理下,反正闲着也没事干,就帮忙写了。(很简单的一个功能,随手记录下,刚好填补下最近博客的空白)

由于只是方便自己的工具,就不需要什么图形界面了,就用Java去写了,先看下效果图~

 

 

嘿嘿,突然发现会写程序是件好事,一千多张表情图片要是手动下载再进行改名,非得忙个2天2夜不可。。

好了,言归正传,说下代码实现,分成3步:

1、获取Json数据

2、根据Json数据所提供的图片资源地址进行下载

3、分类,规范命名

 

先来看下Json数据格式:

为了方便操作,我封装了一个数据实体类

 1 package com.lcw.downloadutil.domain; 2  3 public class Bean { 4  5   private String phrase; 6   private String type; 7   private String url; 8   private Boolean hot; 9   private Boolean common;10   private String category;11   private String icon;12   private String value;13   private String picid;14 15   public String getPhrase() {16     return phrase;17   }18 19   public void setPhrase(String phrase) {20     this.phrase = phrase;21   }22 23   public String getType() {24     return type;25   }26 27   public void setType(String type) {28     this.type = type;29   }30 31   public String getUrl() {32     return url;33   }34 35   public void setUrl(String url) {36     this.url = url;37   }38 39   public Boolean getHot() {40     return hot;41   }42 43   public void setHot(Boolean hot) {44     this.hot = hot;45   }46 47   public Boolean getCommon() {48     return common;49   }50 51   public void setCommon(Boolean common) {52     this.common = common;53   }54 55   public String getCategory() {56     return category;57   }58 59   public void setCategory(String category) {60     this.category = category;61   }62 63   public String getIcon() {64     return icon;65   }66 67   public void setIcon(String icon) {68     this.icon = icon;69   }70 71   public String getValue() {72     return value;73   }74 75   public void setValue(String value) {76     this.value = value;77   }78 79   public String getPicid() {80     return picid;81   }82 83   public void setPicid(String picid) {84     this.picid = picid;85   }86 87   @Override88   public String toString() {89     return "Bean [phrase=" + phrase + ", type=" + type + ", url=" + url + ", hot=" + hot + ", common=" + common + ", category=" + category + ", icon=" + icon + ", value=" + value + ", picid=" + picid + "]";90   }91 92 }

然后封装了一些方法,分别有用来处理(网络数据的获取,Json数据的反序列化,对图片资源的下载)

 1 package com.lcw.downloadutil.utils; 2  3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.BufferedReader; 6 import java.io.File; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 import java.io.InputStream; 10 import java.io.InputStreamReader; 11 import java.net.MalformedURLException; 12 import java.net.URL; 13 import java.util.List; 14  15 import com.google.gson.Gson; 16 import com.google.gson.reflect.TypeToken; 17 import com.lcw.downloadutil.domain.Bean; 18  19 /** 20  * 工具类集合 21  *  22  * @author Rabbit_Lee 23  *  24 */ 25 public class HelpUtils { 26   /** 27    * 根据所提供的url地址获取Json数据 28    *  29    * @param path 30    * @return 31   */ 32   public String getHttpString(String path) { 33     // 存放获取到的数据 34     String info = ""; 35     // 网络请求所需变量 36     InputStream in = null; 37     InputStreamReader reader = null; 38     BufferedReader bufferedReader = null; 39     try { 40       URL url = new URL(path); 41       // 根据Url打开地址,以utf-8编码的形式返回输入流 42       in = url.openStream(); 43       reader = new InputStreamReader(in, "utf-8"); 44       bufferedReader = new BufferedReader(reader); 45       // 临时接受数据变量 46       String temp = null; 47       while ((temp = bufferedReader.readLine()) != null) { 48         info += temp; 49       } 50       return info; 51     } catch (MalformedURLException e) { 52       e.printStackTrace(); 53     } catch (IOException e) { 54       e.printStackTrace(); 55     } finally { 56       try { 57         in.close(); 58         reader.close(); 59         bufferedReader.close(); 60       } catch (IOException e) { 61         e.printStackTrace(); 62       } 63     } 64     return null; 65   } 66  67   /** 68    * 将所提供的Json数据反序列化成Java对象(List集合) 69    *  70    * @param json 71    * @return 72   */ 73   public List<Bean> changeJsonToList(String json) { 74     // 利用Gson将JSON数据反序列化成JAVA对象 75     Gson gson = new Gson(); 76     List<Bean> beans = gson.fromJson(json, new TypeToken<List<Bean>>() { 77     }.getType()); 78     return beans; 79   } 80  81   /** 82    * 下载图片,并按照指定的路径存储 83    * @param bean 84    * @param filePath 85   */ 86   public void makeImage(Bean bean, String filePath) { 87     // 网络请求所需变量 88     try { 89       //获取输入流 90       BufferedInputStream in = new BufferedInputStream(new URL(bean.getUrl()).openStream()); 91       //创建文件流 92       File file = new File(filePath + bean.getPhrase()+".gif"); 93       BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); 94       //缓冲字节数组 95       byte[] data = new byte[2048]; 96       int length = in.read(data); 97       while (length != -1) { 98         out.write(data, 0, data.length); 99         length = in.read(data);100       }101       System.out.println("正在执行下载任务:当前正在下载图片" + bean.getPhrase() + ".gif");102       in.close();103       out.close();104     } catch (MalformedURLException e) {105       e.printStackTrace();106     } catch (IOException e) {107       e.printStackTrace();108     }109   }110 111 }

上面代码对于Json数据的处理,我用到了谷歌给我们提供的Gson工具类

对于Gson类不懂使用的朋友可以看下我之前写过的一篇文章:《Gson简要使用笔记》:http://www.cnblogs.com/lichenwei/p/3987429.html

接着,就是调用主类:

 1 package com.lcw.downloadutil.main; 2  3 import java.util.List; 4  5 import com.lcw.downloadutil.domain.Bean; 6 import com.lcw.downloadutil.utils.HelpUtils; 7  8 public class TaskMain { 9 10   private static final String URL = "这里涉及到Oauth2.0的一些个人隐私数据就不给出了";11   private static String mJsonInfo;12 13   public static void main(String[] args) {14     HelpUtils helpUtils = new HelpUtils();15     // 获取Json数据16     mJsonInfo = helpUtils.getHttpString(URL);17     // 将Json数据反序列化成java对象18     List<Bean> beans = helpUtils.changeJsonToList(mJsonInfo);19     //循环遍历下载图片20     for (int i = 0; i < beans.size(); i++) {21       helpUtils.makeImage(beans.get(i), "C:/images/");22     }23 24   }25 26 }

 

到这里就完事了,有哪里不清楚的朋友,可以文章评论交流。

作者:Balla_兔子
出处:http://www.cnblogs.com/lichenwei/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!