`
zhiweiofli
  • 浏览: 515131 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

自动更新图片的任务类

阅读更多

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

相关推荐

    excel技巧图片自动更新

    通过VBA,你可以设置定时任务定期检查并更新图片。首先,打开VBA编辑器(按下Alt + F11),创建一个新的模块,然后添加以下代码: ```vba Sub UpdatePictures() Dim sh As Worksheet For Each sh In ...

    android自动切换图片

    这通常包括获取当前显示的图片索引,计算下一个要显示的图片索引,然后更新ImageView的图片资源。如果设置有循环播放,当到达最后一张图片时,应重置回第一张。 4. **动画效果**:为了提升用户体验,可以在切换图片...

    Delphi 开发的程序自动更新控件

    在IT行业中,开发软件时确保程序能够自动更新是一项重要的任务,因为它可以帮助用户轻松获取软件的最新功能和安全修复。在Delphi编程环境中,有多种方法可以实现程序的自动更新,其中一个便是通过使用特定的更新控件...

    android自动播放图片

    可以使用Handler和Runnable来实现定时任务,或者使用Timer和TimerTask类。例如,使用Handler的postDelayed方法可以设置延迟执行的任务: ```java Handler handler = new Handler(); handler.postDelayed(new ...

    自动发说说自动换图片

    【标题】"自动发说说自动换图片"指的是利用编程技术实现的一种自动化功能,它能够定期或按照预设条件在社交平台,如QQ空间上自动发布状态更新,并且每次发布时自动更换配图。这样的应用通常用于个人或者企业账号的...

    SD 使用的 模型信息自动更新插件

    "SD 使用的 模型信息自动更新插件"是一种针对Stablediffusion软件的辅助工具,旨在提升用户在处理模型信息时的效率和便捷性。该插件的主要功能是自动扫描并同步SD模型的相关数据,包括但不限于模型参数、模型结构...

    Android自动切换图片

    为了实现自动切换图片,我们通常会结合使用Handler、Runnable和Thread,或者是使用Android提供的Animator类或者ViewFlipper组件。 1. Handler-Runnable机制: 创建一个Runnable对象,在run()方法中改变ImageView的...

    新闻图片自动切换

    当`Timer`触发时,`Handler`会发送一个消息到消息队列,然后`Handler`的`handleMessage()`方法会被调用,从而更新`ViewPager`的当前页,实现图片的自动切换。 实现这一功能的具体步骤可能包括以下几个部分: 1. ...

    EXCEL 或WPS 自动插入图片代码

    VBA是Microsoft Office套件中的内置编程语言,允许用户自定义工作流程,自动化重复任务。在Excel或WPS中,我们可以通过VBA编写宏来执行特定操作,比如自动插入图片。 **宏的创建与运行** 1. **创建宏**: 在Excel或...

    壁纸自动更新

    "壁纸自动更新"是一款针对Android平台的软件应用,旨在为用户提供个性化的壁纸更换服务,让用户能够根据自己的喜好和兴趣自动更换手机桌面背景。这款服务不仅增加了手机使用的趣味性,也充分体现了Android系统的开放...

    c# 图片自动播放

    在C#编程环境中,实现一个图片自动播放的功能是一项常见的任务,尤其在开发多媒体应用程序或桌面小工具时。这个功能允许用户选择一个包含多张图片的文件夹,然后程序会按照顺序逐一显示这些图片,同时提供播放、暂停...

    C#实现图片浏览自动播放

    在C#编程环境中,开发一个图片浏览自动播放的应用是一个常见的任务,尤其对于图像处理或多媒体应用来说。这个项目中,开发者使用了ListView控件来实现这一功能。ListView控件是Windows Forms中的一个强大组件,它...

    PHP自动更新电影网站源码

    定时任务可以设定在特定时间执行脚本,自动从指定的数据源抓取新电影信息,而异步处理则可以在后台不干扰用户浏览的情况下进行数据更新。此外,源码可能还集成了API接口,与各大电影数据库(如IMDb或豆瓣电影)进行...

    js 实现图片自动切换

    在JavaScript中实现图片自动切换是一项常见的前端开发任务,主要用于创建动态、吸引人的用户界面,例如轮播图或幻灯片展示。以下将详细介绍如何利用JavaScript实现这一功能。 首先,我们需要理解基本的HTML结构,...

    xp 桌面背景图片自动切换

    本项目的核心在于监控指定的图片目录,当有新图片添加或更新时,自动将其设置为桌面背景。Delphi中可以使用TDirectory和TFile类来监控文件系统的变化,同时利用System.Win.ComObj单元中的Wallpaper属性改变桌面壁纸...

    图片浏览器(Java实现) 自动播放图片

    在IT领域,开发一个图片浏览器是一项常见的任务,尤其对于初学者来说,这能帮助他们更好地理解和运用编程语言。本项目是用Java实现的图片浏览器,它具有自动播放图片的功能,给人一种观看动画片的体验。接下来,我们...

    javascript图片自动旋转

    在JavaScript中实现图片自动旋转是一项常见的任务,尤其在动态展示或者动画效果中。这个功能的实现主要涉及到HTML、CSS和JavaScript三者的结合。下面将详细解释如何使用JavaScript来完成图片的自动旋转。 首先,...

    一款批量图片自动去除黑边、调整大小、压缩体积的软件.exe

    本软件能批量处理本地图片,具有范围裁剪、自动去除黑边、调整大小、压缩体积等功能。 通过范围裁剪和去黑边两种功能配合,可以绕过图片边缘的干扰色块,提取图片中部的所需内容。一键去除黑边打开主程序,将任意 ...

    C#源码:批量自动去除图片白边

    在IT行业中,图片处理是一项常见的任务,特别是在图形设计、数据分析和多媒体应用中。本文将深入讲解如何使用C#编程语言实现一个批量自动去除图片白边的程序,这可以帮助用户节省大量手动裁剪的时间,提高效率。 ...

    jquery 图片自动切换

    本项目是关于利用 jQuery 实现一个图片自动切换的功能,结合淡入淡出效果,同时具备左右按钮和分页索引控制,提升用户体验。以下将详细介绍这个项目的实现原理和相关知识点。 首先,我们要理解 jQuery 的基本用法。...

Global site tag (gtag.js) - Google Analytics