DiskLruCache 并没有限制缓存的位置,可以自己设置,但是一般的应用程序都会讲缓存卑职设置为/sdcard/Android/data/<application package>/cache
这样做有两个好处
1,存储位置在sdcard 上,不会对手机的内置存储空间造成影响
2,这个路径被android系统认定为应用程序的缓存路径,当应用程序卸载时,改书记一并清除掉,不会留下残余数据
DiskLruCache 并不是在sdk中, 需要自己下载。
获取缓存路径
/***
* 获取缓存路径
* @param context
* @param filePath
* @return
*/
public static File getDiskCacheDir(Context context ,String filePath){
File path;
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
path = context.getExternalCacheDir();
}else{
path = context.getCacheDir();
}
File file = new File(path + File.separator +filePath);
return file;
}
前者获取到的就是 /sdcard/Android/data/<application package>/cache 这个路径,而后者获取到的是 /data/data/<application package>/cache 这个路径。
/****
* 创建缓存文件夹
* @param context
* @param fileDirName
* @return
*/
public static DiskLruCache creatDiskLurCacheDir(Context context ,String fileDirName){
DiskLruCache mDiskCache = null;
try {
//得到缓存文件
File diskCacheDir = getDiskCacheDir(context, fileDirName);
if(!diskCacheDir.exists())
diskCacheDir.mkdirs();
mDiskCache = DiskLruCache.open(diskCacheDir, 1, 1,DISK_CACHE_SIZE);
Log.v(TAG, "path === "+ diskCacheDir.getPath());
Log.v(TAG, "absolutePath === "+diskCacheDir.getAbsolutePath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mDiskCache;
}
其中 DiskLruCache.open(File directory, int appVersion, int valueCount, long maxSize)
directory 文件夹
appVersion 当前应用的appversion,当version 变化的时候,缓存文件会清除,需要重新从网络下载等
valueCount 一个文件名对应几个文件,一般为 1,
maxSize 文件的最大的size
保存文件到缓存文件夹
public void save2Cache(String key, Object obj) {
OutputStream out = null;
if(obj == null)
return;
String str = obj.toString();
try {
DiskLruCache.Editor editor = fileDiskLruCache.edit(key);
if(editor != null){
out = editor.newOutputStream(0);
if(!TextUtils.isEmpty(str)){
out.write(str.getBytes());
editor.commit();
}else{
editor.abort();
}
fileDiskLruCache.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DiskCacheCommonUtils.closeSliently(out);
}
}
获取缓存文件
public Object getFromCache(String key) {
BufferedReader br = null;
String str ="";
try {
DiskLruCache.Snapshot snapShot = fileDiskLruCache.get(key);
if (snapShot != null) {
br = new BufferedReader(new InputStreamReader(snapShot.getInputStream(0)));
String line = "";
while((line = br.readLine()) != null){
str += line;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DiskCacheCommonUtils.closeSliently(br);
}
return str;
}