当前位置: 首页 > 科技观察

基于Java批量下载网络图片

时间:2023-03-18 12:57:15 科技观察

昨天朋友遇到需要下载上千张微博表情图片到本地盘,给了一堆Json数据,帮我处理一下,反正,闲着没事干,就帮忙写。(很简单的一个功能,写下来,正好填补最近博客的空缺)既然只是为了自己方便的工具,不需要什么图形界面,所以用Java写就可以了。先来看看效果图吧~嘿嘿,突然发现会写程序是个好东西。如果手动下载一千多张表情图片再重命名,我得忙上2天2夜。.好了言归正传,说说代码实现,分为3步:1.获取Json数据2.根据Json数据提供的图片资源地址下载3.分类规范命名。先来看Json数据格式:为了操作方便,我封装了一个数据实体类packagecom.lcw.downloadutil.domain;publicclassBean{privateStringphrase;privateStringtype;privateStringurl;privateBooleanhot;privateBooleancommon;privateStringcategory;privateStringicon;privateStringvalue;privateStringpicid;publicStringgetPhrase(){returnphrase;ph}publicvoidsetPhrase)(this=phrase;}publicStringgetType(){returntype;}publicvoidsetType(Stringtype){this.type=type;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.url=url;}publicBooleangetHot(){returnhot;}publicvoidsetHot(Booleanhot){this.hot=hot;}publicBooleangetCommon(){returncommon;}publicvoidsetCommon(Booleancommon){this.common=common;}publicStringgetCategory(){returncategory;}publicvoidsetCategory(Stringcategory){this.category=category;}publicStringgetIcon(){returnicon;}publicvoidsetIcon(Stringicon){this.icon=icon;}publicStringgetValue(){returnvalue;}publicvoidsetValue(Stringvalue){this.value=value;}publicStringgetPicid(){returnpicid;}publicvoidsetPicid(Stringpicid){this.picid=picid;}@OverridepublicStringtoString(){return"Bean[phrase="+phrase+",type="+type+",url="+url+",hot="+hot+",common="+common+",category="+category+",icon="+icon+",value="+value+",picid="+picid+"]";}}然后写了一个工具类,里面封装了一些处理方法(网络数据的获取,Json数据的反序列化,图片资源的下载)packagecom.lcw.downloadutil.utils;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.MalformedURLException;importjava.net.URL;importjava.util.List;importcom.google.gson.Gson;importcom.google.gson.reflect.TypeToken;importcom.lcw.downloadutil.domain.Bean;/***工具类集合**@authorRabbit_Lee**/publicclassHelpUtils{/***根据提供的url地址获取Json数据**@parampath*@return*/publicStringgetHttpString(Stringpath){//存储获取的数据Stringinfo="";//网络请求所需的变量InputStreamin=null;InputStreamReaderreader=null;BufferedReaderbufferedReader=null;try{URLurl=newURL(path);//根据Url打开地址,返回utf-8编码形式的输入流in=url.openStream();reader=newInputStreamReader(in,"utf-8");bufferedReader=newBufferedReader(reader);//临时接受数据变量Stringtemp=null;while((temp=bufferedReader.readLine())!=null){info+=temp;}returninfo;}catch(MalformedURLExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{try{in.close();reader.close();bufferedReader.close();}catch(IOExceptione){e.printStackTrace();}}returnnull;}/***将提供的Json数据反序列化为Java对象(List集合)**@paramjson*@return*/publicListchangeJsonToList(Stringjson){//使用Gson反序列化将JSON数据转化为JAVA对象Gsongson=newGson();Listbeans=gson.fromJson(json,newTypeToken>(){}.getType());returnbeans;}/***下载图片并按照说明操作指定路径存储*@parambean*@paramfilePath*/publicvoidmakeImage(Beanbean,StringfilePath){//网络请求需要的变量try{//获取输入流BufferedInputStreamin=newBufferedInputStream(newURL(bean.getUrl()).openStream());//创建文件流Filefile=newFile(filePath+bean.getPhrase()+".gif");BufferedOutputStreamout=newBufferedOutputStream(newFileOutputStream(file));//缓冲字节数组byte[]data=newbyte[2048];intlength=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(MalformedURLExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}上面代码中Json数据的处理,我使用了Google提供的Gson工具类。不懂Gson类的可以看我之前写的一篇文章:《Gson简要使用笔记》:http://www.cnblogs.com/lichenwei/p/3987429.htmlpackagecom.lcw.downloadutil.main;importjava.util.List;importcom.lcw.downloadutil.domain.Bean;importcom.lcw.downloadutil.utils.HelpUtils;publicclassTaskMain{privatestaticfinalStringURL="此处一些与Oauth2.0相关的个人隐私数据不会给出";privatestaticStringmJsonInfo;publicstaticvoidmain(String[]args){HelpUtilshelpUtils=newHelpUtils();//获取Json数据mJsonInfo=helpUtils.getHttpString(URL);//将Json反序列化dataintojavaobjectsListbeans=helpUtils.changeJsonToList(mJsonInfo);//循环下载图片for(inti=0;i