import java.util.ArrayList;
import java.util.HashMap;
public final class Demo {
private long ID=0;
private HashMap<String,String> nameUrlMap;
private HashMap<String,String> urlNameMap;
private HashMap<String,Long> urlTimeMap;
private HashMap<Long,String> timeUrlMap;
private HashMap<String,Integer> urlSizeMap;
private ArrayList<Long> timeList;
private int size;
private int useSize;
private String formatList;
private static String[] ZEROS={"","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000"};
private static int NAMELEN=16;
public Demo(){
this.ID=0;
this.useSize=0;
this.size=10*1024*1024;
this.formatList="jpg/jpeg/png/gif/bmp/amr/mid/mp3/mp4/rm/rmvb/3gp/flv";
this.timeList=new ArrayList<Long>();
this.nameUrlMap=new HashMap<String,String>();
this.urlNameMap=new HashMap<String,String>();
this.urlTimeMap=new HashMap<String,Long>();
this.urlSizeMap=new HashMap<String,Integer>();
this.timeUrlMap=new HashMap<Long,String>();
}
/*****************************************************************************
Description : 设置缓存的空间大小,
Prototype : public void setCacheSize(int size)
Input Param : 参数size表示空间大小,单位为均为字节
Return Value : 无
*****************************************************************************/
public void setCacheSize(int size) {
/* 在这里实现功能 */
this.size=size;
}
/*****************************************************************************
Description : 设置支持缓存的文件格式
Prototype : public void setCacheFormat(String formatList)
Input Param : formatList,支持的格式列表,输入字符串例如“jpg/jpeg/PNG”,输入不区分大小写
Return Value : 无
*****************************************************************************/
public void setCacheFormat(String formatList) {
/* 在这里实现功能 */
this.formatList=formatList.toLowerCase();
}
/*****************************************************************************
Description : 清除设置
Prototype : public void clearSetting()
Input Param : 无
Return Value : 无
*****************************************************************************/
public void clearSetting() {
/* 在这里实现功能 */
this.size=10*1024;
this.formatList="jpg/jpeg/png/gif/bmp/amr/mid/mp3/mp4/rm/rmvb/3gp/flv";
}
/*****************************************************************************
Description : 存储该URL对应的文件,并返回一个随机生成的文件名
Prototype : public String cacheResource(String url, int size)
Input Param : url为常见的HTTP的URL格式, size为资源文件大小
Output Param : 无
Return Value : 成功返回新生成的文件名;
失败返回:failure
*****************************************************************************/
public String cacheResource(String url, int size) {
/* 在这里实现功能 */
if(size>this.size){
return "failure";
}
String format=url.substring(url.lastIndexOf(".")+1);
if(!this.formatList.contains(format.toLowerCase())){
return "failure";
}
long curtime=System.currentTimeMillis();
if(this.urlTimeMap.containsKey(url)){
long time=this.urlTimeMap.get(url);
this.timeList.remove(time);
this.timeList.add(curtime);
this.urlTimeMap.put(url, curtime);
this.timeUrlMap.remove(time);
this.timeUrlMap.put(curtime, url);
return this.urlNameMap.get(url);
}
while(size>this.size-this.useSize){
long time=timeList.remove(0);
String turl=this.timeUrlMap.get(time);
String tname=this.urlNameMap.get(turl);
int tsize=this.urlSizeMap.get(turl);
this.urlNameMap.remove(turl);
this.nameUrlMap.remove(tname);
this.urlTimeMap.remove(turl);
this.timeUrlMap.remove(time);
this.urlSizeMap.remove(turl);
this.useSize-=tsize;
}
String name=this.ID+"."+format;
name=ZEROS[NAMELEN-name.length()]+name;
this.ID++;
//System.out.println(name);
this.timeList.add(curtime);
this.urlSizeMap.put(url, size);
this.urlNameMap.put(url, name);
this.nameUrlMap.put(name, url);
this.urlTimeMap.put(url, curtime);
this.timeUrlMap.put(curtime, url);
this.useSize+=size;
return name;
}
/*****************************************************************************
Description : 根据新生成的文件名,获取该资源文件对应的URL,为cacheResource的逆操作
Prototype : public String getUrlByName(string filename)
Input Param : filename为cacheResource生成的文件名
Output Param : 无
Return Value : 成功返回URL;
失败返回:failure
*****************************************************************************/
public String getUrlByName(String filename) {
/* 在这里实现功能 */
if(this.nameUrlMap.containsKey(filename)){
return this.nameUrlMap.get(filename);
}
return "failure";
}
/*****************************************************************************
Description : 返回url对应的文件在缓存中是否存在
Prototype : public boolean checkCache(String url)
Input Param : 待查询的url
Return Value : 成功返回true,失败返回false
*****************************************************************************/
public boolean checkCache(String url) {
/* 在这里实现功能 */
return this.urlNameMap.containsKey(url);
}
/*****************************************************************************
Description : 清除cache
Prototype : public void clearCache(String url)
Input Param : 无
Return Value : 无
*****************************************************************************/
public void clearCache() {
/* 在这里实现功能 */
this.useSize=0;
this.timeList.clear();
this.urlNameMap.clear();
this.urlSizeMap.clear();
this.urlTimeMap.clear();
this.timeUrlMap.clear();
this.nameUrlMap.clear();
}
}
本地缓存
最新推荐文章于 2024-09-13 14:26:30 发布