缓存统一管理工具类--android


import android.content.Context;
import android.os.Environment;
import android.support.annotation.Nullable;
import com.lidroid.xutils.db.annotation.NotNull;
import junit.framework.Assert;
import .R;
import .utils.*;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * Created by xiaoyee on 7/12/15.
 * 缓存管理工具类
 * <p>
 * 如若想添加缓存路径,则在{@link .constants.IYDCache.DirType DirType}中添加对应的类型
 * </p>
 */
public class IYDCache {
    private static final String TAG = "IYDCache";

    public static final String CACHE_ROOT            = "root_cache";
    public static final String CACHE_VIDEO          = "video_cache";
    public static final String CACHE_IMAGE          = "image_cache";
    public static final String CACHE_VIDEO_MATERIAL = "material_cache";

    //TODO 此项待修改
    private static String mCacheDir;
    private static String mPicCachePath;

    private static String ROOT_DIR;

    /**
     * 存储所有的缓存文件路径
     * <p>
     * <ui>
     * <li>key--{@link DirType#dirName() DirType的dirName方法返回值}</li>
     * <li>value--完整路径,如 /storage/emulated/0/Android/root_cache/video_cache </li>
     * </ui>
     * </p>
     */
    private static HashMap<String, String> mCacheDirBox = new HashMap<>();

    /**
     * 第一次因为父目录未先初始化而失败的类型
     */
    private static List<DirType> mInitFailedDirType = new ArrayList<>();

    /**
     * 一般文件的前缀,如视频文件名为"iydXXXX.mp4"
     */
    private static final String IYD = "iyd";

    /**
     * 是否成功初始化
     */
    private static boolean mIsInited = false;

    /**
     * 文件类型
     */
    public enum FileType {
        PNG(".png"),
        JPG(".jpg"),
        MP4(".mp4");

        /**
         * 后缀名
         */
        final String mSuffix;

        FileType(String suffix) {
            this.mSuffix = suffix;
        }

        /**
         * 获取后缀名
         *
         * @return 指定类型的后缀名,如‘.mp4‘
         */
        public String suffix() {
            return this.mSuffix;
        }
    }

    /**
     * 根据缓存类型,缓存文件类型以及其url获取此项该有的完整路径,如"/storage/emulated/0/Android/root_cache/video_cache/iyd1736054267.mp4"
     *
     * @param type     缓存类型。  此处用枚举,目的是确保想用的缓存路径已经添加了,如果没有记得添加
     * @param url      缓存目标的url,如图片对应的链接
     * @param fileType 文件类型,如mp4,png等,如需扩展,请在{@link .constants.IYDCache.FileType FileType}中添加
     * @return 结果形如 /storage/emulated/0/Android/root_cache/video_cache/iyd1736054267.mp4
     */
    public static String getFileNameWithPath(DirType type, String url, FileType fileType) {
        return getIYDCacheDirThisType(type) + File.separator + generateNameFromUrl(url, fileType);
    }

    /**
     * 根据url生成文件名,此处保证如果url相同,那么返回值也相同
     * <p>
     * //NOTE: 注意:此文件名含有后缀
     * </p>
     * <p>
     * 实际是 " iyd + url的哈希值 + 后缀名 " 的拼接
     * </p>
     *
     * @param url      目标对应的url
     * @param fileType 文件类型
     * @return 结果形如 iyd1736054267.mp4
     */
    public static String generateNameFromUrl(String url, FileType fileType) {
        if (StringUtils.isBlank(url)) {
            return StringUtils.empty();
        }

        return IYD + url.hashCode() + fileType.suffix();
    }

    /**
     * 根据哈希值,生成文件名  无后缀名
     *
     * @param hashcode 目标哈希值
     * @return 返回结果形如 iyd1736054267
     */
    public static String generateNameFromHashcode(int hashcode) {
        return IYD + hashcode;
    }

    /**
     * 基于对象,生成文件名;无后缀名
     * <p>
     * 此处目的是保证同一个对象,返回同样的文件名,但是依赖于对象的equal方法和hashCode方法
     * </p>
     *
     * @return 返回结果形如 iyd1736054267
     */
    public static String generateNameFromObj(Object obj) {
        return IYD + obj.hashCode();
    }

    /**
     * 获取指定缓存类型的 缓存文件夹
     * <p>
     *     注意,返回值可以为空
     * </p>
     *
     * @param type 缓存类型 {@link .constants.IYDCache.DirType}
     * @return 形如"/storage/emulated/0/Android/root_cache/video_cache"或“/storage/emulated/0/Android/root_cache”
     */
    @Nullable
    public static String getIYDCacheDirThisType(DirType type) {
        if (!mIsInited) {
            throw new IllegalArgumentException(ResourceUtils.getString(R.string.not_init) + "确保在application中调用了本类的initCacheDir方法");
        }
        String key = type.dirName();

        if (mCacheDirBox.containsKey(key)) {
            return mCacheDirBox.get(key);
        } else {
            LogCus.e(TAG, "没找到与此对应的目录" + key);
            return StringUtils.empty();
        }
    }

    /**
     * 清空指定缓存文件夹中的所有内容
     * @param dirType 指定缓存文件夹类型 对应{@link .constants.IYDCache.DirType DirType}
     */
    public static void clearCacheThisDir(final DirType dirType) {
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        FileUtils.clearDir(getIYDCacheDirThisType(dirType));
                    }
                }
        ).start();
    }

    /**
     * 初始化所有缓存文件夹,应该在application的onCreate方法中调用
     */
    public static void initCacheDir(Context context) {
        if (!SDCardUtil.isSDCardExist()) {
            ToastUtils.show(context, ResourceUtils.getString(R.string.check_memory_is_ok));
            return;
        }

        File androidDir = Environment.getExternalStoragePublicDirectory("Android");

        ROOT_DIR = androidDir.getAbsolutePath();

        mIsInited = true;

        //初始化所有缓存文件夹
        DirType[] allDirType = DirType.values();
        for (DirType dirType : allDirType) {
            initDirWithParentDirType(dirType);
        }

        //初始化失败的那些
        for (DirType dirType : mInitFailedDirType) {
            initDirWithParentDirType(dirType);
        }

    }

    private static void initDirWithParentDirType(DirType childDir) {

        String parentDirPath;

        //TODO 先后问题,如果父目录未初始化时,先初始化了子目录。。。
        //获取父目录文件夹路径
        if (childDir == DirType.ROOT) {
            //如果是根目录,那么直接定义
            if (StringUtils.isBlank(ROOT_DIR)) {
                throw new IllegalArgumentException("请先初始化根目录,也就是先调用 ROOT_DIR = androidDir.getAbsolutePath(); ");
            }
            parentDirPath = ROOT_DIR;
        } else {
            //否则,直接设置;父目录文件夹完整路径,应该通过 父目录对应的目录名获得
            parentDirPath = mCacheDirBox.get(childDir.parentDirType().dirName());
        }

        LogCus.d("父路径>>>" + parentDirPath);

        if (StringUtils.isBlank(parentDirPath) || !parentDirPath.contains(ROOT_DIR)) {

            mInitFailedDirType.add(childDir);
            return;
        }

        String dirPath = spliceSeparator(parentDirPath, childDir.dirName());

        if (!FileUtils.isFolderExistOrCreateSuccess(dirPath)) {
            LogCus.d("初始化文件夹失败" + dirPath);
            return;
        }

        mCacheDirBox.put(childDir.dirName(), dirPath);
    }

    private static String spliceSeparator(String... dir) {
        StringBuilder result = new StringBuilder();
        for (String s : dir) {
            result.append(s);
            result.append(File.separator);
        }
        return result.toString();
    }

    public static String getCacheDir() {
        return mCacheDir;
    }

    public static void setCacheDir(String mCacheDir) {
        IYDCache.mCacheDir = mCacheDir;
    }

    /**
     * 缓存文件夹类型,//NOTE: 确保添加进来的类型,其dir与parentDir路径在此类中定义
     * <p>
     *     要注意此枚举类型中的顺序,父目录一定要写在子目录之前
     * </p>
     */
    public enum DirType {
        /**
         * 缓存根目录 iyd_cache
         */
        ROOT(CACHE_ROOT, ROOT_DIR),
        /**
         * 视频缓存目录 video_cache; 其父目录为 CACHE_ROOT
         */
        VIDEO(CACHE_VIDEO, CACHE_ROOT),
        /**
         * 图片缓存目录 image_cache; 其父目录为 CACHE_ROOT
         */
        IMAGE(CACHE_IMAGE, CACHE_ROOT),
        /**
         * 素材缓存目录 material_cache; 其父目录为 CACHE_ROOT
         */
        MATERIAL(CACHE_VIDEO_MATERIAL, CACHE_ROOT),;

        private String mDir;
        private String mParentDir;

        public String getParentDir() {
            return mParentDir;
        }

        /**
         * @param dir       当前目录名
         * @param parentDir 父目录名
         */
        DirType(String dir, String parentDir) {
            this.mDir = dir;
            this.mParentDir = parentDir;
        }

        public void setParentDir(String parentDir) {
            this.mParentDir = parentDir;
        }

        /**
         * 获取缓存文件夹名称,如video_cache
         *
         * @return 返回结果形如 video_cache
         */
        public String dirName() {
            return mDir;
        }

        /**
         * 获取父目录的DirType,调用此方法时,一定确保其不是ROOT
         */
        public DirType parentDirType() {
            DirType[] dirTypes = DirType.values();
            for (DirType dirType : dirTypes) {
                //此项的父目录,和某项的当前目录对应
                if (mParentDir.equals(dirType.dirName())) {
                    return dirType;
                }
            }

            throw new IllegalArgumentException("没找到对应的父文件夹>>>" + mParentDir + ";1、请确保已经添加了并且mParentDir是对应的;2、一定确保调用此方法的类型不是ROOT");
        }
    }
}

清空文件夹中的方法

/**
     * removes subdirectories and their contents
     */
    static void purgeDirectory(File dir) {
        for (File file: dir.listFiles()) {
            if (file.isDirectory()) purgeDirectory(file);
            file.delete();
        }
    }

    /**
     * 清空文件夹中的内容,包括子目录
     * @param path
     */
    public static void clearDir(String path) {
        //LogCus.d("删除" + path + "目录下的所有内容");
        if (StringUtils.isBlank(path)) {
            return;
        }

        File file = new File(path);
        purgeDirectory(file);
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 20:27:50

缓存统一管理工具类--android的相关文章

Android中的管理工具类log可以这么些.....

做Android开发的一个重要的工具就是locat,这是代码调试,出错排除定位等必不可少的工具,也是习以为常的, 首先我就来先说一下log吧. 它属于android.util.log类.常用的打印日志的方法有5个如下 : Log.v(tag,message) :   //verbose模式,打印最详细的信息 Log.d(tag,message) :   //debug模式,打印调试的信息 Log.i(tag,message) :    //info Log.w(tag,message) :   

Fragment管理工具类

Fragment相关→FragmentUtils.java→Demo addFragment : 新增fragment removeFragment : 移除fragment replaceFragment : 替换fragment popFragment : 出栈fragment popToFragment : 出栈到指定fragment popAddFragment : 先出栈后新增fragment hideFragment : 隐藏fragment showFragment : 显示fra

Spring AOP整合redis 实现缓存统一管理

项目使用redis作为缓存数据,但面临着问题,比如,项目A,项目B都用到redis,而且用的redis都是一套集群,这样会带来一些问题.问题:比如项目A的开发人员,要缓存一些热门数据,想到了redis,于是乎把数据放入到了redis,自定义一个缓存key:hot_data_key,数据格式是项目A自己的数据格式,项目B也遇到了同样的问题,也要缓存热门数据,也是hot_data_key,数据格式是项目B是自己的数据格式,由于用的都是同一套redis集群,这样key就是同一个key,有的数据格式适合

【Android工具类】Activity管理工具类AppManager

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 import java.util.Stack; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; /** * * @ClassName: com.qust.myutils.AppManager * @Description: Activity管理类:用于管理Act

android内存管理工具类

public class MemoryManager { private static final String TAG = "MemoryManager"; private static final int MAXMEMORY=50*1024*1024;//程序运行的最大内存 /** * 判断系统是否在低内存下运行 * @param context * @return */ public static boolean hasAcailMemory() { // 获取手机内部空间大小

缓存清理的工具类

import android.content.Context; import android.os.Environment; import java.io.File; import java.math.BigDecimal; public class DataCleanUtil { /** * 获取缓存大小 * @param context * @return * @throws Exception */ public static String getTotalCacheSize(Contex

前端参数统一校验工具类ValidParamUtils

1,前端参数不可信,对于后端开发人员来说应该是一条铁律,所以对于前端参数的校验,必不可少,而统一的前端参数校验工具,对我们进行参数校验起到事半功倍的效果 2,统一参数校验工具ValidParamUtils public class ValidParamUtils { public static void validInputParams(BindingResult bindingResult) throws ParameterValidErrorException { if(bindingRes

DateTimeUtil 工具类,android 和 java 通用

import java.sql.Date;import java.text.SimpleDateFormat; public class DateTimeUtil { public final class FormatType {        public static final String FULL = "yyyy:MM:dd HH:mm:ss:SSS";        public static final String DATE = "yyyy:MM:dd&quo

【笔记】cookies管理工具类

package com.ulearning.ulms.util; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServle