自动更新图片的任务类

即时的网上抓图,尽管可以保证图片是最新的,但是遇上网络环境差的地方,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;
    	}
    	
		@Override
		public void run() {
			String date=getCurrentMonth();  
			String fileUrl = CACHE_URI+date+"/";
			downloadCreateImg(path, fileUrl);
		}
    	
    }
	/**
	 * 周期删除本地缓存的时间任务
	 * @author zhiweiofli
	 *
	 */
	class DeleCacheTask extends TimerTask{
		
		@Override
		public 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() + "删除任务完成!"); 
			
		}
	}
}

你可能感兴趣的:(java,.net,cache,F#)