自动更新图片的任务类
即时的网上抓图,尽管可以保证图片是最新的,但是遇上网络环境差的地方,load图的过程就会令人抓狂!假设图片的更新是有周期的,隔一段时间,图片才会换掉,那么为本地的程序弄一个本地的缓存,来提升加载图片的效率,这就变得十分有必要!
?
之前由于客户需求,搞了一个自动下载并自动更新本地图片的类,现在拿出来与大家分享:
?
具体的思路是:先初始化网络图片的URL,以及本地缓存的URL,本地缓存用大时间作为分类条件,方便日后程序对过期的图片缓存进行删除。然后,开一任务线程把图片下载到本地,当外部程序炫耀加载网络图片时,先去读取本地的缓存,若本地已存在改图片,则直接加载本地的缓存,否则再去请求网络图片。此外还有一过期图片自动删除的任务线程,在类初始化时,就已经启动,专门负责把存在已超过一定时间的图片整批地删除。
?
package com.godlsien.ebon.business.ebon;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.net.URL;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Timer;import java.util.TimerTask; /** * 本地图片缓存管理类 * @author zhiweiofli * */public class ImageManager {public static String CACHE_URI = ""; private Timer timer = null;private static ImageManager tpim = null;/** * 构造方法 * @param url */private ImageManager(String url){CACHE_URI = url;if(timer!=null){timer.cancel();timer = null;}timer = new Timer();timer.schedule(new DeleCacheTask(), 0, 86400000); //每隔一天,执行一次删除图片的任务mkdir(url);}/** * * @param url 本地缓存路径 * @return */public static ImageManager getIntance(String url){if(tpim==null){tpim = new ImageManager(url);}return tpim;}/** * * @return null if CACHE_URI is null */public static ImageManager getIntance(){if(tpim==null){if(CACHE_URI!=""){tpim = new ImageManager(CACHE_URI);} else {tpim = null;}}return tpim;}/** * 创建本地缓存的方法 * @param url 图片的网络路径 */public void createCache(String url){timer.schedule(new CreateCacheTask(url), 5000); //5秒后,开始下载图片}/** * 下载图片并生成图片缓存 * @param imgUrl 图片的网络路径 * @param fileURL 图片的本地路径 */ public void downloadCreateImg(String imgUrl,String fileURL) { try { // 创建流 BufferedInputStream in = new BufferedInputStream(new URL(imgUrl) .openStream()); String imgName = getFileName(imgUrl); System.out.println("download img name:" + imgName); String folder = fileURL.substring(0, fileURL.lastIndexOf("/")+1); System.out.println("floder path:" + folder); mkdir(folder); // 存放地址 fileURL+=imgName; System.out.println("save img path:" + fileURL); File img = new File(fileURL); if(!img.exists()){ // 生成图片 BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(img)); byte[] buf = new byte[2048]; int length = in.read(buf); while (length != -1) { out.write(buf, 0, length); length = in.read(buf); } out.close(); } else { System.out.println("umage cache file exited"); } in.close(); System.out.println("image cache save complete"); } catch (Exception e) { e.printStackTrace(); } } /** * 用于创建文件夹的方法 * @param mkdirName */ public void mkdir(String path){ try{ File dirFile = new File(path); boolean bFile = dirFile.exists(); if(bFile == true){ System.out.println("The folder exists."); }else{ System.out.println("The folder do not exist,now trying to create a one..."); bFile = dirFile.mkdir(); if(bFile == true){ System.out.println("Create successfully!"); }else{ System.out.println("Disable to make the folder,please check the disk is full or not."); System.exit(1); } } }catch(Exception err){ System.err.println("ELS - Chart : 文件夹创建发生异常"); err.printStackTrace(); } } /** * 获取网络图片的文件名 * @param url * @return ImgName */ public String getFileName(String url){ int index = url.lastIndexOf("/"); return url.substring(index+1, url.length()); } /*** * 判断文件夹是或否过期的方法 * @param filePath 文件夹路径 * @return */ public boolean isOutDate(String filePath){Calendar cal = Calendar.getInstance(); int index = filePath.indexOf(CACHE_URI)+CACHE_URI.length()+1;System.out.println("the index of last / :" + index);String fileName = filePath.substring(index, filePath.length());System.out.println("dele folder name:" + fileName);String[] ss = fileName.split("-");int year = Integer.parseInt(ss[0]);int month = Integer.parseInt(ss[1]);if(year <= cal.get(Calendar.YEAR)){if(month < (cal.get(Calendar.MONTH)+1)){return true;} else {return false;}} else {return false;}} public String getCurrentMonth(){ SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM"); return sdf.format(new java.util.Date()); } /** * 创建本地缓存的任务 * @author zhiweiofli * */ class CreateCacheTask extends TimerTask{ private String path = ""; CreateCacheTask(String url){ path = url; } @Overridepublic void run() {String date=getCurrentMonth(); String fileUrl = CACHE_URI+date+"/";downloadCreateImg(path, fileUrl);} }/** * 周期删除本地缓存的时间任务 * @author zhiweiofli * */class DeleCacheTask extends TimerTask{@Overridepublic void run() {System.out.println(new java.util.Date() + "删除任务开始执行!"); File file = new File(CACHE_URI);File[] files = file.listFiles();if(files!=null){for(File f:files){if(f.isDirectory()){String fPath = f.getPath();System.out.println("dele path:"+fPath);if(isOutDate(fPath)){if(f.delete()){System.out.println(new java.util.Date() + "删除成功!"); } else {System.out.println(new java.util.Date() + "删除失败!"); }}}}}System.out.println(new java.util.Date() + "删除任务完成!"); }}}