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

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

 

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

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

1、获取Json数据

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

3、分类,规范命名

先来看下Json数据格式:

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

 package com.lcw.downloadutil.domain;

 public class Bean {

     private String phrase;
private String type;
private String url;
private Boolean hot;
private Boolean common;
private String category;
private String icon;
private String value;
private String picid; public String getPhrase() {
return phrase;
} public void setPhrase(String phrase) {
this.phrase = phrase;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public Boolean getHot() {
return hot;
} public void setHot(Boolean hot) {
this.hot = hot;
} public Boolean getCommon() {
return common;
} public void setCommon(Boolean common) {
this.common = common;
} public String getCategory() {
return category;
} public void setCategory(String category) {
this.category = category;
} public String getIcon() {
return icon;
} public void setIcon(String icon) {
this.icon = icon;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public String getPicid() {
return picid;
} public void setPicid(String picid) {
this.picid = picid;
} @Override
public String toString() {
return "Bean [phrase=" + phrase + ", type=" + type + ", url=" + url + ", hot=" + hot + ", common=" + common + ", category=" + category + ", icon=" + icon + ", value=" + value + ", picid=" + picid + "]";
} }

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

分别用来处理(网络数据的获取,Json数据的反序列化,对图片资源的下载)

 package com.lcw.downloadutil.utils;

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.lcw.downloadutil.domain.Bean; /**
* 工具类集合
*
* @author Rabbit_Lee
*
*/
public class HelpUtils {
/**
* 根据所提供的url地址获取Json数据
*
* @param path
* @return
*/
public String getHttpString(String path) {
// 存放获取到的数据
String info = "";
// 网络请求所需变量
InputStream in = null;
InputStreamReader reader = null;
BufferedReader bufferedReader = null;
try {
URL url = new URL(path);
// 根据Url打开地址,以utf-8编码的形式返回输入流
in = url.openStream();
reader = new InputStreamReader(in, "utf-8");
bufferedReader = new BufferedReader(reader);
// 临时接受数据变量
String temp = null;
while ((temp = bufferedReader.readLine()) != null) {
info += temp;
}
return info;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
reader.close();
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
} /**
* 将所提供的Json数据反序列化成Java对象(List集合)
*
* @param json
* @return
*/
public List<Bean> changeJsonToList(String json) {
// 利用Gson将JSON数据反序列化成JAVA对象
Gson gson = new Gson();
List<Bean> beans = gson.fromJson(json, new TypeToken<List<Bean>>() {
}.getType());
return beans;
} /**
* 下载图片,并按照指定的路径存储
* @param bean
* @param filePath
*/
public void makeImage(Bean bean, String filePath) {
// 网络请求所需变量
try {
//获取输入流
BufferedInputStream in = new BufferedInputStream(new URL(bean.getUrl()).openStream());
//创建文件流
File file = new File(filePath + bean.getPhrase()+".gif");
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
//缓冲字节数组
byte[] data = new byte[2048];
int length = in.read(data);
while (length != -1) {
out.write(data, 0, data.length);
length = in.read(data);
}
System.out.println("正在执行下载任务:当前正在下载图片" + bean.getPhrase() + ".gif");
in.close();
out.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }

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

对于Gson类不懂使用的朋友可以看下我之前写过的一篇文章:

Gson简要使用笔记》:http://www.cnblogs.com/lichenwei/p/3987429.html

接着,就是调用主类:

 package com.lcw.downloadutil.main;

 import java.util.List;

 import com.lcw.downloadutil.domain.Bean;
import com.lcw.downloadutil.utils.HelpUtils; public class TaskMain { private static final String URL = "这里涉及到Oauth2.0的一些个人隐私数据就不给出了";
private static String mJsonInfo; public static void main(String[] args) {
HelpUtils helpUtils = new HelpUtils();
// 获取Json数据
mJsonInfo = helpUtils.getHttpString(URL);
// 将Json数据反序列化成java对象
List<Bean> beans = helpUtils.changeJsonToList(mJsonInfo);
//循环遍历下载图片
for (int i = 0; i < beans.size(); i++) {
helpUtils.makeImage(beans.get(i), "C:/images/");
} } }

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

作者: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. 老菜鸟学习:Javascript 将html转成pdf

    起因:处理某个项目,需要把页面上的数据(订单.运单)等导出pdf. 第一个想法:从 Java 层去想.但是经过各种资料查询和实践,第一个想法宣告放弃: 幸好客户的要求是:导出的 pdf 尺寸要和打印的 ...

  2. boost 1.67编译VS2017版本

    最近想系统学习并使用一下boost的asio异步网络库,所以需要编译boost库使用,下面简单介绍如何编译. 编译环境 boost1.67版本,windows 10,VS2017 下载boost 建议 ...

  3. CSS属性级Hack

     CSS属性级Hack    color:red; /* 所有浏览器可识别*/   _color:red; /* 仅IE6 识别 */   *color:red; /* IE6.IE7 识别 */   ...

  4. Reveal:分析iOS UI的利器

    转:http://security.ios-wiki.com/issue-3-4/ Reveal简介 Reveal是分析iOS应用UI的利器: Reveal能够在运行时调试和修改iOS应用程序.它能连 ...

  5. LM && NTLM && ophcrack && RainBow table (转)

    Windows密码的加密方式:Windows 主要使用以下两种(包含但不限于)算法对用户名和密码进行加密:分 别是LanManager(LM)和NTLM,LM只能存储小于等于14个字符的密码hash, ...

  6. iOS开发-命令模式

    命令模式算是设计模式中比较简单的,最常见的例子是工作任务安排下来进行编程,如果工作任务不需要完成,我们可以取消我们之前完成的代码,也可以理解为回滚撤销操作.这里面涉及到命令模式中的两个对象,一个是动作 ...

  7. centos7下opencv3的安装

    前面说过opencv和python模块的安装,版本是基于opencv 2的,这篇主要说一下opencv3的安装过程以及相关依赖问题的解决,同样opencv3的安装包在官网上可以下载,最新稳定版是3.3 ...

  8. Microsoft/Git-Credential-Manager-for-Mac-and-Linux

    纠正Mac上的错误: Fatal: java.lang.Error encountered. Details: unexpected errorfatal: credential helper '!/ ...

  9. top命令详析及排查问题使用演示

    1. top基本使用 top命令运行图 第一行:基本信息 第二行:任务信息 第三行:CPU使用情况 第四行:物理内存使用情况 buff/cache: buffers 和 cache 都是内存中存放的数 ...

  10. 关于redis中SDS简单动态字符串

    1.SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *).它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制 ...