缓存工具类

作者:Abraham   阅读 (5861)  |  收藏 (0)  |  点赞 (0)

摘要

安卓开发一般都需要进行数据缓存,常用操作老司机已为你封装完毕,经常有小伙伴问怎么判断缓存是否可用,那我告诉你,你可以用这份工具进行存储和查询,具体可以查看源码,现在为你开车,Demo传送门


原文链接:缓存工具类

安卓开发一般都需要进行数据缓存,常用操作老司机已为你封装完毕,经常有小伙伴问怎么判断缓存是否可用,那我告诉你,你可以用这份工具进行存储和查询,具体可以查看源码,现在为你开车,Demo传送门

站点

缓存工具类 → AppACache

put : 保存String数据到缓存中
getAsString : 读取String数据
getAsJSONObject : 读取JSONObject数据
getAsJSONArray : 读取JSONArray数据
getAsBinary : 获取byte数据
getAsObject : 读取Serializable数据
getAsBitmap : 读取bitmap数据
getAsDrawable : 读取Drawable数据
file : 获取缓存文件
remove : 除某个key
clear : 清除所有数据

具体路线

public class AppACache {

// 用法例子// ACache mCache = ACache.get(this); // 初始化,一般放在基类里// mCache.put("test_key1","test value");// mCache.put("test_key2", "test value", 10);// 保存10秒,如果超过10秒去获取这个key,将为null// mCache.put("test_key3", "test value", 2 ACache.TIME_DAY);// 保存两天,如果超过两天去获取这个key,将为null// String value = mCache.getAsString("test_key1");// 获取数据public static final int TIME_HOUR = 60 * 60;public static final int TIME_DAY = TIME_HOUR * 24;private static final int MAX_SIZE = 1000 * 1000 * 50; // 50 mbprivate static final int MAX_COUNT = Integer.MAX_VALUE; // 不限制存放数据的数量private static Map<String, AppACache> mInstanceMap = new HashMap<String, AppACache>();private ACacheManager mCache;public static AppACache get(Context ctx) {    return get(ctx, "ACache");\n}public static AppACache get(Context ctx, String cacheName) {\n    File f = new File(ctx.getCacheDir(), cacheName);    return get(f, MAX_SIZE, MAX_COUNT);\n}public static AppACache get(File cacheDir) {    return get(cacheDir, MAX_SIZE, MAX_COUNT);\n}public static AppACache get(Context ctx, long max_zise, int max_count) {\n    File f = new File(ctx.getCacheDir(), "ACache");    return get(f, max_zise, max_count);\n}public static AppACache get(File cacheDir, long max_zise, int max_count) {\n    AppACache manager = mInstanceMap.get(cacheDir.getAbsoluteFile() + myPid());    if (manager == null) {\n        manager = new AppACache(cacheDir, max_zise, max_count);\n        mInstanceMap.put(cacheDir.getAbsolutePath() + myPid(), manager);\n    }    return manager;\n}private static String myPid() {    return "_" + android.os.Process.myPid();\n}private AppACache(File cacheDir, long max_size, int max_count) {    if (!cacheDir.exists() && !cacheDir.mkdirs()) {        throw new RuntimeException("can't make dirs in "\n                + cacheDir.getAbsolutePath());\n    }\n    mCache = new ACacheManager(cacheDir, max_size, max_count);\n}/**\n * Provides a means to save a cached file before the data are available.\n * Since writing about the file is complete, and its close method is called,\n * its contents will be registered in the cache. Example of use:\n *\n * ACache cache = new ACache(this) try { OutputStream stream =\n * cache.put("myFileName") stream.write("some bytes".getBytes()); // now\n * update cache! stream.close(); } catch(FileNotFoundException e){\n * e.printStackTrace() }\n */class xFileOutputStream extends FileOutputStream {\n    File file;    public xFileOutputStream(File file) throws FileNotFoundException {        super(file);        this.file = file;\n    }    public void close() throws IOException {        super.close();\n        mCache.put(file);\n    }\n}// =======================================// ============ String数据 读写 ==============// =======================================/**\n * 保存 String数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的String数据\n */public void put(String key, String value) {\n    File file = mCache.newFile(key);\n    BufferedWriter out = null;    try {\n        out = new BufferedWriter(new FileWriter(file), 1024);\n        out.write(value);\n    } catch (IOException e) {\n        e.printStackTrace();\n    } finally {        if (out != null) {            try {\n                out.flush();\n                out.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        mCache.put(file);\n    }\n}/**\n * 保存 String数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的String数据\n * @param saveTime\n *            保存的时间,单位:秒\n */public void put(String key, String value, int saveTime) {\n    put(key, Utils.newStringWithDateInfo(saveTime, value));\n}/**\n * 读取 String数据\n * \n * @param key\n * @return String 数据\n */public String getAsString(String key) {\n    File file = mCache.get(key);    if (!file.exists())        return null;    boolean removeFile = false;\n    BufferedReader in = null;    try {\n        in = new BufferedReader(new FileReader(file));\n        String readString = "";\n        String currentLine;        while ((currentLine = in.readLine()) != null) {\n            readString += currentLine;\n        }        if (!Utils.isDue(readString)) {            return Utils.clearDateInfo(readString);\n        } else {\n            removeFile = true;            return null;\n        }\n    } catch (IOException e) {\n        e.printStackTrace();        return null;\n    } finally {        if (in != null) {            try {\n                in.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }        if (removeFile)\n            remove(key);\n    }\n}// =======================================// ============= JSONObject 数据 读写 ==============// =======================================/**\n * 保存 JSONObject数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的JSON数据\n */public void put(String key, JSONObject value) {\n    put(key, value.toString());\n}/**\n * 保存 JSONObject数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的JSONObject数据\n * @param saveTime\n *            保存的时间,单位:秒\n */public void put(String key, JSONObject value, int saveTime) {\n    put(key, value.toString(), saveTime);\n}/**\n * 读取JSONObject数据\n * \n * @param key\n * @return JSONObject数据\n */public JSONObject getAsJSONObject(String key) {\n    String JSONString = getAsString(key);    try {\n        JSONObject obj = new JSONObject(JSONString);        return obj;\n    } catch (Exception e) {\n        e.printStackTrace();        return null;\n    }\n}// =======================================// ============ JSONArray 数据 读写 =============// =======================================/**\n * 保存 JSONArray数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的JSONArray数据\n */public void put(String key, JSONArray value) {\n    put(key, value.toString());\n}/**\n * 保存 JSONArray数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的JSONArray数据\n * @param saveTime\n *            保存的时间,单位:秒\n */public void put(String key, JSONArray value, int saveTime) {\n    put(key, value.toString(), saveTime);\n}/**\n * 读取JSONArray数据\n * \n * @param key\n * @return JSONArray数据\n */public JSONArray getAsJSONArray(String key) {\n    String JSONString = getAsString(key);    try {\n        JSONArray obj = new JSONArray(JSONString);        return obj;\n    } catch (Exception e) {\n        e.printStackTrace();        return null;\n    }\n}// =======================================// ============== byte 数据 读写 =============// =======================================/**\n * 保存 byte数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的数据\n */public void put(String key, byte[] value) {\n    File file = mCache.newFile(key);\n    FileOutputStream out = null;    try {\n        out = new FileOutputStream(file);\n        out.write(value);\n    } catch (Exception e) {\n        e.printStackTrace();\n    } finally {        if (out != null) {            try {\n                out.flush();\n                out.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        mCache.put(file);\n    }\n}/**\n * Cache for a stream\n *\n * @param key\n *            the file name.\n * @return OutputStream stream for writing data.\n * @throws FileNotFoundException\n *             if the file can not be created.\n */public OutputStream put(String key) throws FileNotFoundException {    return new xFileOutputStream(mCache.newFile(key));\n}/**\n *\n * @param key\n *            the file name.\n * @return (InputStream or null) stream previously saved in cache.\n * @throws FileNotFoundException\n *             if the file can not be opened\n */public InputStream get(String key) throws FileNotFoundException {\n    File file = mCache.get(key);    if (!file.exists())        return null;    return new FileInputStream(file);\n}/**\n * 保存 byte数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的数据\n * @param saveTime\n *            保存的时间,单位:秒\n */public void put(String key, byte[] value, int saveTime) {\n    put(key, Utils.newByteArrayWithDateInfo(saveTime, value));\n}/**\n * 获取 byte 数据\n * \n * @param key\n * @return byte 数据\n */public byte[] getAsBinary(String key) {\n    RandomAccessFile RAFile = null;    boolean removeFile = false;    try {\n        File file = mCache.get(key);        if (!file.exists())            return null;\n        RAFile = new RandomAccessFile(file, "r");        byte[] byteArray = new byte[(int) RAFile.length()];\n        RAFile.read(byteArray);        if (!Utils.isDue(byteArray)) {            return Utils.clearDateInfo(byteArray);\n        } else {\n            removeFile = true;            return null;\n        }\n    } catch (Exception e) {\n        e.printStackTrace();        return null;\n    } finally {        if (RAFile != null) {            try {\n                RAFile.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }        if (removeFile)\n            remove(key);\n    }\n}// =======================================// ============= 序列化 数据 读写 ===============// =======================================/**\n * 保存 Serializable数据 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的value\n */public void put(String key, Serializable value) {\n    put(key, value, -1);\n}/**\n * 保存 Serializable数据到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的value\n * @param saveTime\n *            保存的时间,单位:秒\n */public void put(String key, Serializable value, int saveTime) {\n    ByteArrayOutputStream baos = null;\n    ObjectOutputStream oos = null;    try {\n        baos = new ByteArrayOutputStream();\n        oos = new ObjectOutputStream(baos);\n        oos.writeObject(value);        byte[] data = baos.toByteArray();        if (saveTime != -1) {\n            put(key, data, saveTime);\n        } else {\n            put(key, data);\n        }\n    } catch (Exception e) {\n        e.printStackTrace();\n    } finally {        try {\n            oos.close();\n        } catch (IOException e) {\n        }\n    }\n}/**\n * 读取 Serializable数据\n * \n * @param key\n * @return Serializable 数据\n */public Object getAsObject(String key) {    byte[] data = getAsBinary(key);    if (data != null) {\n        ByteArrayInputStream bais = null;\n        ObjectInputStream ois = null;        try {\n            bais = new ByteArrayInputStream(data);\n            ois = new ObjectInputStream(bais);\n            Object reObject = ois.readObject();            return reObject;\n        } catch (Exception e) {\n            e.printStackTrace();            return null;\n        } finally {            try {                if (bais != null)\n                    bais.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }            try {                if (ois != null)\n                    ois.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n    }    return null;\n\n}// =======================================// ============== bitmap 数据 读写 =============// =======================================/**\n * 保存 bitmap 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的bitmap数据\n */public void put(String key, Bitmap value) {\n    put(key, Utils.Bitmap2Bytes(value));\n}/**\n * 保存 bitmap 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的 bitmap 数据\n * @param saveTime\n *            保存的时间,单位:秒\n */public void put(String key, Bitmap value, int saveTime) {\n    put(key, Utils.Bitmap2Bytes(value), saveTime);\n}/**\n * 读取 bitmap 数据\n * \n * @param key\n * @return bitmap 数据\n */public Bitmap getAsBitmap(String key) {    if (getAsBinary(key) == null) {        return null;\n    }    return Utils.Bytes2Bimap(getAsBinary(key));\n}// =======================================// ============= drawable 数据 读写 =============// =======================================/**\n * 保存 drawable 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的drawable数据\n */public void put(String key, Drawable value) {\n    put(key, Utils.drawable2Bitmap(value));\n}/**\n * 保存 drawable 到 缓存中\n * \n * @param key\n *            保存的key\n * @param value\n *            保存的 drawable 数据\n * @param saveTime\n *            保存的时间,单位:秒\n */public void put(String key, Drawable value, int saveTime) {\n    put(key, Utils.drawable2Bitmap(value), saveTime);\n}/**\n * 读取 Drawable 数据\n * \n * @param key\n * @return Drawable 数据\n */public Drawable getAsDrawable(String key) {    if (getAsBinary(key) == null) {        return null;\n    }    return Utils.bitmap2Drawable(Utils.Bytes2Bimap(getAsBinary(key)));\n}/**\n * 获取缓存文件\n * \n * @param key\n * @return value 缓存的文件\n */public File file(String key) {\n    File f = mCache.newFile(key);    if (f.exists())        return f;    return null;\n}/**\n * 移除某个key\n * \n * @param key\n * @return 是否移除成功\n */public boolean remove(String key) {    return mCache.remove(key);\n}/**\n * 清除所有数据\n */public void clear() {\n    mCache.clear();\n}/**\n * @title 缓存管理器\n * @version 1.0\n */public class ACacheManager {    private final AtomicLong cacheSize;    private final AtomicInteger cacheCount;    private final long sizeLimit;    private final int countLimit;    private final Map<File, Long> lastUsageDates = Collections\n            .synchronizedMap(new HashMap<File, Long>());    protected File cacheDir;    private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {        this.cacheDir = cacheDir;        this.sizeLimit = sizeLimit;        this.countLimit = countLimit;\n        cacheSize = new AtomicLong();\n        cacheCount = new AtomicInteger();\n        calculateCacheSizeAndCacheCount();\n    }    /**\n     * 计算 cacheSize和cacheCount\n     */\n    private void calculateCacheSizeAndCacheCount() {        new Thread(new Runnable() {            @Override\n            public void run() {                int size = 0;                int count = 0;\n                File[] cachedFiles = cacheDir.listFiles();                if (cachedFiles != null) {                    for (File cachedFile : cachedFiles) {\n                        size += calculateSize(cachedFile);\n                        count += 1;\n                        lastUsageDates.put(cachedFile,\n                                cachedFile.lastModified());\n                    }\n                    cacheSize.set(size);\n                    cacheCount.set(count);\n                }\n            }\n        }).start();\n    }    private void put(File file) {        int curCacheCount = cacheCount.get();        while (curCacheCount + 1 > countLimit) {            long freedSize = removeNext();\n            cacheSize.addAndGet(-freedSize);\n\n            curCacheCount = cacheCount.addAndGet(-1);\n        }\n        cacheCount.addAndGet(1);        long valueSize = calculateSize(file);        long curCacheSize = cacheSize.get();        while (curCacheSize + valueSize > sizeLimit) {            long freedSize = removeNext();\n            curCacheSize = cacheSize.addAndGet(-freedSize);\n        }\n        cacheSize.addAndGet(valueSize);\n\n        Long currentTime = System.currentTimeMillis();\n        file.setLastModified(currentTime);\n        lastUsageDates.put(file, currentTime);\n    }    private File get(String key) {\n        File file = newFile(key);\n        Long currentTime = System.currentTimeMillis();\n        file.setLastModified(currentTime);\n        lastUsageDates.put(file, currentTime);        return file;\n    }    private File newFile(String key) {        return new File(cacheDir, key.hashCode() + "");\n    }    private boolean remove(String key) {\n        File image = get(key);        return image.delete();\n    }    private void clear() {\n        lastUsageDates.clear();\n        cacheSize.set(0);\n        File[] files = cacheDir.listFiles();        if (files != null) {            for (File f : files) {\n                f.delete();\n            }\n        }\n    }  /*\n     * Drawable → Bitmap\n     */\n    private static Bitmap drawable2Bitmap(Drawable drawable) {        if (drawable == null) {            return null;\n        }        // 取 drawable 的长宽\n        int w = drawable.getIntrinsicWidth();        int h = drawable.getIntrinsicHeight();        // 取 drawable 的颜色格式\n        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888\n                : Bitmap.Config.RGB_565;        // 建立对应 bitmap\n        Bitmap bitmap = Bitmap.createBitmap(w, h, config);        // 建立对应 bitmap 的画布\n        Canvas canvas = new Canvas(bitmap);\n        drawable.setBounds(0, 0, w, h);        // 把 drawable 内容画到画布中\n        drawable.draw(canvas);        return bitmap;\n    }    /*\n     * Bitmap → Drawable\n     */\n    @SuppressWarnings("deprecation")    private static Drawable bitmap2Drawable(Bitmap bm) {        if (bm == null) {            return null;\n        }        return new BitmapDrawable(bm);\n    }\n}

}

终点站

好了,终点站到了,如果对本次旅途满意的话,请给五星好评哦,没关注的小伙伴轻轻点个上方的关注,毕竟老司机牺牲了很多时间才换来这么一份工具类,如果该工具类依赖其他工具类,都可以在我的史上最全的常用开发工具类收集(持续更新中)中找到。


分类   Android
字数   16917

博客标签    缓存  

评论