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