首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

自动更新图片的任务种

2012-11-05 
自动更新图片的任务类即时的网上抓图,尽管可以保证图片是最新的,但是遇上网络环境差的地方,load图的过程就

自动更新图片的任务类

即时的网上抓图,尽管可以保证图片是最新的,但是遇上网络环境差的地方,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() + "删除任务完成!"); }}}

热点排行