DiskLruCache本地缓存

   Android进行数据本地缓存的方式,google官方认可方式。

 适用场景:网络获取数据(文字,图片)进行本地缓存,无网络时读取本地缓存显示数据。

  使用步骤:

  1.在项目中创建libcore.io包,将DiskLruCache.java文件放入包中。

   DiskLruCache.java地址:点击进入下载页

 2.获取DiskLruCache 实例化对象

  
  /**
   * 获取DiskLruCache,创建(如果不存在)一个文件名为json的文件夹

*/
 public DiskLruCache mDiskLruCache = null;
 public void getMDiskLruCache(){
 try {
        //获取缓存的存储路径
        File cacheDir = getDiskCacheDir(this, "json");
 if (!cacheDir.exists()) {
            cacheDir.mkdirs();
        }
        //获取DiskLruCache对象  参数1:缓存路径  参数2:app应用版本号 参数3:DiskLruCache版本号 参数4:设置缓存空间大小
  mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(this), 1, 10 * 1024 * 1024);
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
  /**
   * 获取缓存的存储路径
   */
  public File getDiskCacheDir(Context context, String uniqueName) {
    String cachePath;
  if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
            || !Environment.isExternalStorageRemovable()) {
  // 获取/sdcard/Android/data/<application package>/cache
        cachePath = context.getExternalCacheDir().getPath();
    } else {
  //获取/data/data/<application package>/cache;
        cachePath = context.getCacheDir().getPath();
    }
  return new File(cachePath + File.separator + uniqueName);
  }
  /**
    * 获取应用程序版本号

*/
  public int getAppVersion(Context context) {
  try {
         PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
  return info.versionCode;
       } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
       }
  return 1;
   }
   /**
    * md5生成唯一文件名
   */
   public String hashKeyForDisk(String key) {
 3.保存文件
   属于耗时操作,实际开发中应在子线程中执行。
   首先对你要保存的文件命名 一般使用md5生成唯一表示作为文件名 
   这里假设有首页的json数据要保存 命名为homejson作为首页json数据的文件保存名 
   String fileKey=hashKeyForDisk("homejson");
   

        String cacheKey;
        try {
          final MessageDigest mDigest = MessageDigest. getInstance ( "MD5" );
          mDigest.update(key.getBytes());
          cacheKey = bytesToHexString(mDigest.digest());
        } catch (NoSuchAlgorithmException e) {
          cacheKey = String. valueOf (key.hashCode());
        }
        return cacheKey;

    }


    private String bytesToHexString( byte [] bytes) {
          StringBuilder sb = new StringBuilder();
          for ( int i = 0 ; i < bytes. length ; i++) {
               String hex = Integer. toHexString ( 0xFF & bytes[i]);
               if (hex.length() == 1 ) {
               sb.append( '0' );
               }
             sb.append(hex);
          }
         return sb.toString();

}

将数据写入设定的缓存文件中:就是通过edit获得一个outputStream流 将文件写入

这里是写入了一个json数据 如果是图片也是同样的道理 只是把bitmap打入流里。

String info="假设这就是首页获取的json数据"

    try {
        DiskLruCache.Editor edit = mDiskLruCache.edit(fileKey);
        OutputStream outputStream = edit.newOutputStream(0);
        outputStream.write(info.getBytes());
        outputStream.flush();
        outputStream.close();
        edit.commit();
        //不要频繁的刷flush() 会费时间  这个一般放在activity的onPause()写就好了
        mDiskLruCache.flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
    这样数据就存入了cache下json文件下了 文件名是homejson这个字段进行md5加密后的一串字母数字组合
 4.读取缓存
   
  直接用制定的文件名 md5生成 保存的文件名 然后去读取就可以了  
  获得一个输入流 读取文件 转化问文字或者bitmap
  以下就是读取3步骤保存的一个字符串。
  try {
    String fileKey=hashKeyForDisk("homejson");
    DiskLruCache.Snapshot snapShot = mDiskLruCache.get(fileKey);
    if (snapShot != null) {
        //snapShot.getInputStream(0);传比disklrucache版本号小 这里穿0 
        InputStream is = snapShot.getInputStream(0);
        byte[] by=new byte[1024];
        int i=0;
        StringBuffer sb=new StringBuffer();
        while((i=is.read(by))!=-1){
             sb.append(new String(by,0,by.length));
        }
        String infom=sb.toString();
        mTVShow.setText(infom+"*");
    }
  } catch (IOException e) {
    e.printStackTrace();
  }
  基本的存储,读取使用就这几步,当然DiskLruCache还提供了删除操作。直接remove(String key)就可以了

  最重要的方法:
  1.没有特别的情况 在activity的onPause()中调用mDiskLruCache.flush()就足够了
   在DiskLruCache缓存路径下会有一个日志文件journal 记录管理这缓存区域下的所有操作信息(时间,key....),
   唯一一个也是最重要的文件,flush()操作是把操作信息同步进入这个文件中。
  2.在activity的iondestory()中调用 disklrycache的close()方法关闭操作。
  3.使用delete方法会删除缓存下的多有文件 一般做清除缓存用。

   。。基本用的就这些。。

  

   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值