您的位置:首页 > 移动开发 > Android开发

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;

 }


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: