4-SII--☆Android缓存文件(带有效时长)封装
零、前言
[1]把我的缓存文件工具改写成了策略模式,感觉还不错。
[2]以前静态方法调用,很方便,但看着就是不爽,代码真的太冗余了。
[3]突然灵光一闪,"少年,看你骨骼惊奇,策略模式了解一下吗。"便有此文。
[4]如果不了解SharedPreferences,可以先看这篇:1-SII--SharedPreferences完美封装
缓存策略类图
一、使用:
//新建缓存对象
CacheWorker innerCache = new CacheWorker(new InnerFileStrategy(this));
//设置缓存
innerCache.setCache("toly", "hehe", 10);
//获取缓存
String value = innerCache.getCache("toly");
//SD卡缓存
CacheWorker sdCache = new CacheWorker(new SDFileStrategy());
sdCache.setCache("toly", "hehe2", 10);
String sdCach = sdCache.getCache("toly");
//SharedPreferences
CacheWorker spCache = new CacheWorker(new SPStrategy(this));
spCache.setCache("toly1994.com", "{name:toly}", 10);
String spValue = spCache.getCache("toly1994.com");
二、附录:各类及实现
/**
* 作者:张风捷特烈<br/>
* 时间:2018/8/26 0026:6:20<br/>
* 邮箱:1981462002@qq.com<br/>
* 说明:缓存策略接口
*/
public interface CacheStrategy {
/**
* 存储缓存
* @param key 文件名
* @param value 文件内容
* @param time 有效时间 单位:小时
*/
void setCache(String key, String value,long time);
/**
* 获取缓存
* @param key 文件名
* @return 文件内容
*/
String getCache(String key);
}
/**
* 作者:张风捷特烈<br/>
* 时间:2018/8/26 0026:6:38<br/>
* 邮箱:1981462002@qq.com<br/>
* 说明:文件缓存基类
*/
public abstract class BaseFileStrategy implements CacheStrategy {
/**
* 缓存文件的文件夹名称
*/
private String mDirName;
/**
* 构造函数
* @param dirName 缓存文件的文件夹名称
*/
public BaseFileStrategy(String dirName) {
mDirName = dirName;
}
@Override
public void setCache(String key, String value, long time) {
// 以url为文件名, 以json为文件内容,保存在本地
// 生成缓存文件
File cacheFile = new File(mDirName + File.separator + Md5Util.getMD5(key));
FileWriter writer = null;
try {
if (!cacheFile.exists()) {
cacheFile.getParentFile().mkdirs();
cacheFile.createNewFile();
}
writer = new FileWriter(cacheFile);
// 缓存失效的截止时间
long deadline = System.currentTimeMillis() + time * 60 * 60 * 1000;//有效期
writer.write(deadline + "\n");// 在第一行写入缓存时间, 换行
writer.write(value);// 写入文件
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.close(writer);
}
}
@Override
public String getCache(String key) {
// 生成缓存文件
File cacheFile = new File(mDirName + File.separator + Md5Util.getMD5(key));
// 判断缓存是否存在
if (cacheFile.exists()) {
// 判断缓存是否有效
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(cacheFile));
String deadline = reader.readLine();// 读取第一行的有效期
long deadTime = Long.parseLong(deadline);
if (System.currentTimeMillis() < deadTime) {// 当前时间小于截止时间,
// 说明缓存有效
// 缓存有效
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} else {
setCache(key, "", 0);//缓存过期清空
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.close(reader);
}
}
return null;
}
}
/**
* 作者:张风捷特烈<br/>
* 时间:2018/8/26 0026:6:28<br/>
* 邮箱:1981462002@qq.com<br/>
* 说明:以文件保存缓存 到本包 <br/>
*/
public class InnerFileStrategy extends BaseFileStrategy {
public InnerFileStrategy(Context context) {
super(context.getCacheDir().getPath());
}
}
/**
* 作者:张风捷特烈<br/>
* 时间:2018/8/26 0026:6:28<br/>
* 邮箱:1981462002@qq.com<br/>
* 说明:以文件保存缓存 到SD卡cacheData目录 <br/>
*/
public class SDFileStrategy extends BaseFileStrategy {
public SDFileStrategy() {
super(Environment.getExternalStorageDirectory() +"/cacheData");
}
}
/**
* 作者:张风捷特烈<br/>
* 时间:2018/8/26 0026:8:03<br/>
* 邮箱:1981462002@qq.com<br/>
* 说明:SharedPreferences缓存
*/
public class SPStrategy implements CacheStrategy {
private Context mContext;
public SPStrategy(Context context) {
mContext = context;
}
@Override
public void setCache(String key, String value, long time) {
SpUtils<String> spString= new SpUtils<>(mContext);
spString.put(key, value);
SpUtils<Long> spLong = new SpUtils<>(mContext);
spLong.put("LiftTime", System.currentTimeMillis() + time * 60 * 60 * 1000);
}
@Override
public String getCache(String key) {
SpUtils<Long> spLong = new SpUtils<>(mContext);
Long liftTime = spLong.get("LiftTime", 0L);
if (System.currentTimeMillis() < liftTime) {// 当前时间小于截止时间,
SpUtils<String> spString= new SpUtils<>(mContext);
return spString.get(key, "");
}else {
setCache(key, "", 0);//缓存过期清空
}
return null;
}
}
/**
* 作者:张风捷特烈<br/>
* 时间:2018/8/26 0026:6:23<br/>
* 邮箱:1981462002@qq.com<br/>
* 说明:缓存工作类
*/
public class CacheWorker {
/**
* 缓存策略
*/
private CacheStrategy mCacheStrategy;
/**
* 无参构造
*/
public CacheWorker() {
}
/**
* 一参构造
* @param cacheStrategy 缓存策略
*/
public CacheWorker(CacheStrategy cacheStrategy) {
mCacheStrategy = cacheStrategy;
}
/**
* 存储缓存
* @param key 文件名
* @param value 文件内容
* @param time 有效时间 单位:小时
*/
public void setCache(String key, String value, long time) {
mCacheStrategy.setCache(key, value, time);
}
/**
* 获取缓存
* @param key 文件名
* @return 文件内容
*/
public String getCache(String key) {
return mCacheStrategy.getCache(key);
}
/**
* 设置缓存策略
* @param cacheStrategy 缓存策略
*/
public void setCacheStrategy(CacheStrategy cacheStrategy) {
mCacheStrategy = cacheStrategy;
}
}
后记、
1.声明:
[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力
2.连接传送门:
更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
简书首发,腾讯云+社区同步更新
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com
3.联系我
QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328
4.欢迎关注我的微信公众号,最新精彩文章,及时送达:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
3-SII--Android的SD卡文件读写
零、前言 [1]读写SD卡需要运行时权限。 [2]如果对运行时权限不清楚的童鞋,可以看一下我的封装:TI--安卓运行时权限完美封装 一、使用:SD卡文件读写 FileHelper fileHelper = FileHelper.get(); //在SD卡追加模式创建:data/writeFile2SD.txt文件,写入"toly" fileHelper.writeFile2SD("data/writeFile2SD.txt", "toly", true); //在SD卡上创建一个空文件 fileHelper.createFile("create/create.txt"); //读取data/writeFile2SD.txt文件 String read = fileHelper.readFromSD("data/writeFile2SD.txt"); System.out.println(read);//tolytolytolytolytolytoly 二、创建文件 判断是否存在SD卡 /** * 判断是否存在SD卡 * * @return 是否存在SD卡 */ private bool...
-
下一篇
Android与Js交互之JSBridge的使用
什么是JsBridge JsBridge是js与Native之间进行通信的桥梁。 为什么要使用JsBridge Android4.2以下的addJavascriptInterface存在安全漏洞,虽然在Android4.2之后用@JavascriptInterface代替了addJavascriptInterface但是由于兼容性和安全性问题,基本上我们不会再利用Android系统为我们提供的addJavascriptInterface方法或者@JavascriptInterface注解来实现,所以我们只能另辟蹊径,去寻找既安全,又能实现兼容Android各个版本的方案。 如何使用JsBridge 在Android中我们使用JsBridge开源项目来实现,实现JSBridge分为以下几个步骤。 步骤一:导入依赖 在项目gradle文件中添加 repositories { ... maven { url "https://jitpack.io" } } 在module的gradle中添加 dependencies { ... implementation 'com.github.lzyz...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL数据库在高并发下的优化方案
- Docker容器配置,解决镜像无法拉取问题