4-SII--☆Android缓存文件(带有效时长)封装

简介: 零、前言[1]把我的缓存文件工具改写成了策略模式,感觉还不错。[2]以前静态方法调用,很方便,但看着就是不爽,代码真的太冗余了。[3]突然灵光一闪,"少年,看你骨骼惊奇,策略模式了解一下吗。

零、前言

[1]把我的缓存文件工具改写成了策略模式,感觉还不错。
[2]以前静态方法调用,很方便,但看着就是不爽,代码真的太冗余了。
[3]突然灵光一闪,"少年,看你骨骼惊奇,策略模式了解一下吗。"便有此文。
[4]如果不了解SharedPreferences,可以先看这篇:1-SII--SharedPreferences完美封装

缓存策略类图

缓存策略.png

一、使用:

        //新建缓存对象
        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");
缓存.png

二、附录:各类及实现

/**
 * 作者:张风捷特烈<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.欢迎关注我的微信公众号,最新精彩文章,及时送达:
公众号.jpg
相关文章
|
5月前
|
前端开发 数据可视化 Java
Android用Canvas画一个折线图,并加以简单封装
本文介绍了如何用Java绘制动态折线图,从固定折线图的实现到封装成可复用的组件。首先通过绘制XY坐标轴、添加坐标标签和绘制折线及数据点完成基础折线图。接着,将静态数据替换为动态输入,支持自定义X轴、Y轴和折线数据。代码中包含关键方法如`drawDaxes`(绘制坐标轴)、`drawAxispoint`(绘制坐标点)和`drawbrokenLine`(绘制折线)。最终实现可根据传入数据动态生成折线图,适用于Android开发中的数据可视化场景。
164 0
|
5月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
101 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
5月前
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
468 19
|
5月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
1182 2
|
8月前
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
743 83
|
4月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
162 0
|
12月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
930 1
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
114 2
|
8月前
|
存储 数据挖掘 虚拟化
vsan数据恢复—vsan缓存盘故障导致虚拟机磁盘文件丢失的数据恢复案例
VMware vsan架构采用2+1模式。每台设备只有一个磁盘组(7+1),缓存盘的大小为240GB,容量盘的大小为1.2TB。 由于其中一台主机(0号组设备)的缓存盘出现故障,导致VMware虚拟化环境中搭建的2台虚拟机的磁盘文件(vmdk)丢失。

热门文章

最新文章