DiskLruCache简介
Android开发中经常用到三级缓存:内存缓存、硬盘缓存、网络缓存。速度也是由快到慢。内存缓存用到的是LruCache,这里来介绍一下硬盘缓存DiskLruCache。
GitHub:DiskLruCache
APIDoc:DiskLruCache
1、添加依赖
DiskLruCache不是Android官方的工具类,是由大神JakeWharton写的。该库已经归档,不再维护。
implementation 'com.jakewharton:disklrucache:2.0.2'2、需要权限
因为是硬盘缓存,所以一定要有存储的读写权限。在AndroidManifest中声明相应的权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />3、使用DiskLruCache
DiskLruCache之所以这么风靡,就是因为使用起来简单,优秀的设计值得参考学习。
3.1、开启缓存
获取DiskLruCache很简单,通过open()静态方法打开一个缓存区域。传入指定缓存的目录、缓存版本、每个key对应的缓存数量、缓存区大小。Android各种目录的获取参考Android开发中的各种Directory。
/*
* directory – 缓存目录
* appVersion - 缓存版本
* valueCount – 每个key对应value的个数
* maxSize – 缓存大小的上限
*/
DiskLruCache diskLruCache = DiskLruCache.open(directory, 1, 1, 1024 * 1024 * 10);DiskLruCache用完需要调用close()关闭:
diskLruCache.close();3.2、添加缓存
向DiskLruCache中添加缓存写入文件。通过key标记不同的缓存记录,key可以通过文件名等信息做MD5加密得到独一无二的值,MD5参考MD5加密。
DiskLruCache.Editor editor = diskLruCache.edit(key);
// index与valueCount对应,分别为0,1,2...valueCount-1;一般为0
editor.newOutputStream(0).write( );
editor.commit();还支持一次写入多个缓存,借助index给每个需要缓存的文件做记录
DiskLruCache.Editor editor = diskLruCache.edit(key);
// index与valueCount对应,分别为0,1,2...valueCount-1
editor.newOutputStream(0).write(...);
editor.newOutputStream(1).write(...);
...
editor.commit();3.3、获取缓存
通过缓存时写入的key,获取对应的缓存:
DiskLruCache.Snapshot snapshot = diskLruCache.get(key);
InputStream inputStream = snapshot.getInputStream(0);
//读取文件
...同样还可以一次从key中读取写入的多个缓存:
DiskLruCache.Snapshot snapshot = diskLruCache.get("1");
InputStream inputStream0 = snapshot.getInputStream(0);
InputStream inputStream1 = snapshot.getInputStream(1);
//读取文件
...4、常用方法
DiskLruCache中的主要方法如下:
| 方法 | 备注 |
|---|---|
| DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize) | 打开一个缓存目录,如果没有则首先创建它,directory:指定数据缓存地址 appVersion:APP版本号,当版本号改变时,缓存数据会被清除 valueCount:同一个key可以对应多少文件 maxSize:最大可以缓存的数据量 |
| Editor edit(String key) | 通过key可以获得一个DiskLruCache.Editor,通过Editor可以得到一个输出流,进而缓存到本地存储上 |
| void flush() | 强制缓冲文件保存到文件系统 |
| Snapshot get(String key) | 通过key值来获得一个Snapshot,如果Snapshot存在,则移动到LRU队列的头部来,通过Snapshot可以得到一个输入流InputStream |
| long size() | 缓存数据的大小,单位是byte |
| boolean remove(String key) | 根据key值来删除对应的数据,如果该数据正在被编辑,则不能删除 |
| void delete() | 关闭缓存并且删除目录下所有的缓存数据,即使有的数据不是由DiskLruCache 缓存到本目录的 |
| void close() | 关闭DiskLruCache,缓存数据会保留在外存中 |
| boolean isClosed() | 判断DiskLruCache是否关闭,返回true表示已关闭 |
| File getDirectory() | 缓存数据的目录 |
5、源码解析
详见。
相关博客:
