昨天朋友做项目遇到一个需求,需要把上千个的微博表情图片下载到本地磁盘,并做好规范命名,塞给我一堆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.  
  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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

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

  1. java+文件批量下载

    这篇文章主要介绍了Java实现批量下载选中文件功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下 1.在action中定义变量 private List<String> downLoa ...

  2. Java实现批量下载《神秘的程序员》漫画

    上周看了西乔的博客“西乔的九卦”.<神秘的程序员们>系列漫画感觉很喜欢,很搞笑.这些漫画经常出现在CSDN“程序员”杂志末页的,以前也看过一些. 后来就想下载下来,但是一张一张的点击右键“ ...

  3. java/resteasy批量下载存储在阿里云OSS上的文件,并打包压缩

    现在需要从oss上面批量下载文件并压缩打包,搜了很多相关博客,均是缺胳膊少腿,要么是和官网说法不一,要么就压缩包工具类不给出 官方API https://help.aliyun.com/documen ...

  4. Java实现批量下载选中文件功能

    1.在action中定义变量 ? 1 2 3 4 5 6 private List<String> downLoadPaths = new ArrayList<String>( ...

  5. java实现批量下载百度图片搜索到的图片

    就是写的个小程序,用于记录一下,方便后续查看,首先感谢下面这个博客,从这篇文章衍生的吧,大家可以学习下: http://www.cnblogs.com/lichenwei/p/4610298.html ...

  6. Node.js 使用爬虫批量下载网络图片到本地

    图片网站往往广告众多,用Node.js写个爬虫下载图片,代码不长,省事不少,比手动一张张保存简直是天与地的区别.以前用Java也做过远程图片下载,但Node.js的下载速度更让人咂舌,这也是非阻塞式变 ...

  7. java多线程批量下载文件

    多线程下载文件 平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果: package test; /** * 文件下载类 * @author luweichen ...

  8. java+web+批量下载文件

    JavaWeb 文件下载功能 文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端. 1 ...

  9. Java多线程的下载器(1)

    实现了一个基于Java多线程的下载器,可提供的功能有: 1. 对文件使用多线程下载,并显示每时刻的下载速度. 2. 对多个下载进行管理,包括线程调度,内存管理等. 一:单个文件下载的管理 1. 单文件 ...

随机推荐

  1. linux 关于时间日期date

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  2. look-into-oracle-redo

    https://fritshoogland.wordpress.com/2018/02/05/a-look-into-oracle-redo-part-2-the-discovery-of-the-k ...

  3. 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况,以及解决方案

    后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440. 解决方法: ...

  4. postgre 导出单表和导入

    pg除了可以通过dump的方式导入和导出.如果只是导出数据,可以直接使用copy 导出 COPY user TO '/tmp/data/test.csv' WITH csv; COPY user(na ...

  5. linux性能采用工具oprofile使用

    1.先收藏几篇博文,先解决问题,周末继续. http://www.cnblogs.com/bangerlee/archive/2012/08/30/2659435.html http://blog.s ...

  6. C# 反编译问题收集

    ILSpy_Master_2.4.0.1963_Binaries return null;   return   default(T); 1 public T Des<T>(byte[] ...

  7. Android 自定义TextView 实现文本间距

    Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacin ...

  8. 内联汇编中的asm和__asm__

    基本的内联汇编代码: asm格式: asm("assembly code"):   使用替换的关键字: 如果必须的话,可以改变用于标识内联汇编代码段的关键字asm.ANSI C规范 ...

  9. RescuePro Deluxe恢复软件SanDisk

      RescuePro Deluxe恢复软件 注册码:RPDLX-0600-67844-04261-27951 买硬盘送的,没有用.   文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论

  10. nginx https 配置样例

    站点nginx https 配置模板 第一章 nginx 支持https 配置样例 其他 相关链接地址 第一章 nginx 支持https 配置样例 说明:https 段配置参数说明 Server 段 ...