android 文件缓存 DiskLruCache
2016-06-22 14:17
495 查看
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;
}
这样做有两个好处
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;
}
相关文章推荐
- android listview和scrollView兼容的一种方法
- Android开发行业的一些新面孔(技术)
- Android常见命令
- Android图片加载库测试
- 安卓简单开发-button的点击效果
- Android断点下载,多线程下载
- Android应用程序 Android制作简单单页导航
- android中的广播
- Android——Service基础机制。
- Android 自定义可以滚动的ViewGroup
- android 隐藏输入法键盘
- Android高级控件之ExpandableListView可以展开的listview
- android:layout_weight的真实含义
- [Android Pro] root用户删除文件提示:Operation not permitted
- Android Studio Ndk环境搭建
- android成长树不规则布局的自适应
- AndroidStudio SDK离线更新
- 如何用 Gradle 构建 Android 工程项目
- 安卓简单开发-获取系统时间
- [Android Pro] adb 进入 recovery, adb 进入 bootloader