基于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.     @Override 
  88.     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.  

然后我写了一个工具类封装了一些方法

分别用来处理(网络数据的获取,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.  

上面代码对于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.  

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

作者:Balla_兔子

来源:51CTO

时间: 2024-09-18 19:31:53

基于Java实现批量下载网络图片的相关文章

Shell脚本实现批量下载网络图片代码分享_linux shell

最近为了做好一个天气预报的项目,需要从Yahoo下载一些天气图标,但是由于图标比较多,有80多张.图标是存储在Yahoo Image网站上的. 迅雷不支持https的下载,虽然可以在浏览器下载,但是在浏览器下载太慢,于是写了一个批量下载图片资源的Shell脚本,完美的解决了这个问题. Yahoo天气图标的地址规则如下:https://s.yimg.com/zz/combo?a/i/us/nws/weather/gr/ + 图标名称 比如: 我使用了2种方法,解决了下载的难题,虽然好久没有写She

javaweb文件打包批量下载代码_java

本文实例为大家分享了javaweb文件打包批量下载,供大家参考,具体内容如下 // 批量下载未批改作业 @RequestMapping(value = "/downloadAllHomework", method = RequestMethod.GET) public void downloadAllHomework(HttpSession httpSession, HttpServletRequest request, HttpServletResponse response, St

java js-java servlet这是单个下载,怎么打包批量下载

问题描述 java servlet这是单个下载,怎么打包批量下载 package cn.szusst.aqms.action.common; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletE

java ftp-java如何实现ftp文件的批量下载以及文件的移动

问题描述 java如何实现ftp文件的批量下载以及文件的移动 FTP服务器下有两个文件夹:current.history 1.如何实现下载FTP服务器current文件夹下的所有文件,并将current文件夹下的所有文件移动到history文件下. 解决方案 java实现ftp下载文件ftp上传和下载文件的java实现Java 实现ftp文件的上传和下载 解决方案二: http://www.cnblogs.com/chen1987lei/archive/2010/11/03/1867668.ht

请问各位 java 批量下载 报错”与服务器的链接被重置“

问题描述 请问各位,我现在做一个批量下载,将几个文件压缩到zip中提供下载,现在下载时总是报"与服务器的链接被重置",请教各位这是什么问题导致的?//获取网络输入流ZipEntry ze = new ZipEntry(filename, "GBK"));//设置文件编码格式zout.putNextEntry(ze);// 设置响应头和下载保存的文件名 response.setContentType("APPLICATION/OCTET-STREAM&quo

在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介

全文检索|索引 内容摘要: Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 从Lucene我们还可以学到什么 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全

基于JAVA技术的搜索引擎的研究与实现

搜索引擎 摘要 网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情.建立搜索引擎就是解决这个问题的最好方法.本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后从网络机器人.索引引擎.Web服务器三个方面进行详细的说明.为了更加深刻的理解这种技术,本人还亲自实现了一个自己的搜索引擎--新闻搜索引擎. 新闻搜索引擎是从指定的Web页面中按照超连接进行解析.搜索,并把搜索到的每条新闻进行索引后加入数据库.然后通过Web服务器接受客户端请求后从索引数据库中搜索出所匹配的新闻. 本人在介绍

基于java nio的memcached客户端

1.xmemcached是什么? xmemcached是基于java nio实现的memcached客户端API. 实际上是基于我实现的一个简单nio框架 http://code.google.com/p/yanf4j/的基础上实现的(目前是基于yanf4j 0.52),核心代码不超过1000行,序列化机制直接挪用spymemcached的Transcoder. 性能方面,在读写简单类型上比之spymemcached还是有差距,在读写比较大的对象(如集合)有效率优势. 当前0.50-beta版本

基于java nio的memcached客户端——xmemcached

1.xmemcached是什么? xmemcached是基于java nio实现的memcached客户端API. 实际上是基于我实现的一个简单nio框架 http://code.google.com/p/yanf4j/的基础上实现的(目前是基于yanf4j 0.52),核心代码不超过1000行,序列化机制直接挪用spymemcached的Transcoder. 性能方面,在读写简单类型上比之spymemcached还是有差距,在读写比较大的对象(如集合)有效率优势. 当 前0.50-beta版