zoukankan      html  css  js  c++  java
  • android文件缓存管理

    缓存类  :

    public class ConfigCache {
    
        private static final String TAG = ConfigCache.class.getName();
    
     
        public static final int CONFIG_CACHE_MOBILE_TIMEOUT  = 3600000;  //1 hour
        public static final int CONFIG_CACHE_WIFI_TIMEOUT    = 300000;   //5 minute
    
        public static String getUrlCache(String url) {
            if (url == null) {
                return null;
    
            }
            String result = null;
            File file = new File(AppApplication.mSdcardDataDir + "/" + getCacheDecodeString(url));
            if (file.exists() && file.isFile()) {
                long expiredTime = System.currentTimeMillis() - file.lastModified();
    
                Log.d(TAG, file.getAbsolutePath() + " expiredTime:" + expiredTime/60000 + "min");
    
                //1. in case the system time is incorrect (the time is turn back long ago)
    
                //2. when the network is invalid, you can only read the cache
    
                if (AppApplication.mNetWorkState != NetworkUtils.NETWORN_NONE && expiredTime < 0) {
    
                    return null;
    
                }
                if(AppApplication.mNetWorkState == NetworkUtils.NETWORN_WIFI
    
                       && expiredTime > CONFIG_CACHE_WIFI_TIMEOUT) {
    
                    return null;
    
                } else if (AppApplication.mNetWorkState == NetworkUtils.NETWORN_MOBILE
    
                       && expiredTime > CONFIG_CACHE_MOBILE_TIMEOUT) {
                    return null;
                }
                try {
    
                    result = FileUtils.readTextFile(file);
    
                } catch (IOException e) {
    
                    e.printStackTrace();
                }
    
            }
    
            return result;
        }
    
        public static void setUrlCache(String data, String url) {
    
            File file = new File(AppApplication.mSdcardDataDir + "/" + getCacheDecodeString(url));
    
            try {
    
                //创建缓存数据到磁盘,就是创建文件
    
                FileUtils.writeTextFile(file, data);
    
            } catch (IOException e) {
    
                Log.d(TAG, "write " + file.getAbsolutePath() + " data failed!");
    
                e.printStackTrace();
    
            }
    
        }
        public static String getCacheDecodeString(String url) {
    
            //1. 处理特殊字符
    
            //2. 去除后缀名带来的文件浏览器的视图凌乱(特别是图片更需要如此类似处理,否则有的手机打开图库,全是我们的缓存图片)
    
            if (url != null) {
    
                return url.replaceAll("[.:/,%?&=]", "+").replaceAll("[+]+", "+");
    
            }
    
            return null;
    
        }
    }

    用法  :

    void getConfig(){
    
            //首先尝试读取缓存
    
            String cacheConfigString = ConfigCache.getUrlCache(CONFIG_URL);
    
            //根据结果判定是读取缓存,还是重新读取
    
            if (cacheConfigString != null) {
    
           //     showConfig(cacheConfigString);   //后面可以是UI更新,仅供参考
    
            } else {
    
                //如果缓存结果是空,说明需要重新加载
    
                //缓存为空的原因可能是1.无缓存;2. 缓存过期;3.读取缓存出错
    
                AsyncHttpClient client = new AsyncHttpClient();
    
                client.get(CONFIG_URL, new AsyncHttpResponseHandler(){
    
                    @Override
    
                    public void onSuccess(String result){
    
                        //成功下载,则保存到本地作为后面缓存文件
    
                        ConfigCache.setUrlCache(result,  CONFIG_URL);
    
                        //后面可以是UI更新,仅供参考
                  //      showConfig(result);
    
                    }
                    @Override
    
                    public void onFailure(Throwable arg0) {
    
                        //根据失败原因,考虑是显示加载失败,还是再读取缓存
                    }
    
                });
            }
    }

    相关的工具类 :

    /**
    * 文件处理工具类
    *  
    * @author naibo-liao
    * @时间: 2013-1-4下午03:13:08
    */  
    public class FileUtils {  
      
        public static final long B = 1;  
        public static final long KB = B * 1024;  
        public static final long MB = KB * 1024;  
        public static final long GB = MB * 1024;  
        private static final int BUFFER = 8192;  
        /**
         * 格式化文件大小<b> 带有单位
         *  
         * @param size
         * @return
         */  
        public static String formatFileSize(long size) {  
            StringBuilder sb = new StringBuilder();  
            String u = null;  
            double tmpSize = 0;  
            if (size < KB) {  
                sb.append(size).append("B");  
                return sb.toString();  
            } else if (size < MB) {  
                tmpSize = getSize(size, KB);  
                u = "KB";  
            } else if (size < GB) {  
                tmpSize = getSize(size, MB);  
                u = "MB";  
            } else {  
                tmpSize = getSize(size, GB);  
                u = "GB";  
            }  
            return sb.append(twodot(tmpSize)).append(u).toString();  
        }  
      
        /**
         * 保留两位小数
         *  
         * @param d
         * @return
         */  
        public static String twodot(double d) {  
            return String.format("%.2f", d);  
        }  
      
        public static double getSize(long size, long u) {  
            return (double) size / (double) u;  
        }  
      
        /**
         * sd卡挂载且可用
         *  
         * @return
         */  
        public static boolean isSdCardMounted() {  
            return android.os.Environment.getExternalStorageState().equals(  
                    android.os.Environment.MEDIA_MOUNTED);  
        }  
      
        /**
         * 递归创建文件目录
         *  
         * @param path
         * */  
        public static void CreateDir(String path) {  
            if (!isSdCardMounted())  
                return;  
            File file = new File(path);  
            if (!file.exists()) {  
                try {  
                    file.mkdirs();  
                } catch (Exception e) {  
                    Log.e("hulutan", "error on creat dirs:" + e.getStackTrace());  
                }  
            }  
        }  
      
        /**
         * 读取文件
         *  
         * @param file
         * @return
         * @throws IOException
         */  
        public static String readTextFile(File file) throws IOException {  
            String text = null;  
            InputStream is = null;  
            try {  
                is = new FileInputStream(file);  
                text = readTextInputStream(is);;  
            } finally {  
                if (is != null) {  
                    is.close();  
                }  
            }  
            return text;  
        }  
      
        /**
         * 从流中读取文件
         *  
         * @param is
         * @return
         * @throws IOException
         */  
        public static String readTextInputStream(InputStream is) throws IOException {  
            StringBuffer strbuffer = new StringBuffer();  
            String line;  
            BufferedReader reader = null;  
            try {  
                reader = new BufferedReader(new InputStreamReader(is));  
                while ((line = reader.readLine()) != null) {  
                    strbuffer.append(line).append("
    ");  
                }  
            } finally {  
                if (reader != null) {  
                    reader.close();  
                }  
            }  
            return strbuffer.toString();  
        }  
      
        /**
         * 将文本内容写入文件
         *  
         * @param file
         * @param str
         * @throws IOException
         */  
        public static void writeTextFile(File file, String str) throws IOException {  
            DataOutputStream out = null;  
            try {  
                out = new DataOutputStream(new FileOutputStream(file));  
                out.write(str.getBytes());  
            } finally {  
                if (out != null) {  
                    out.close();  
                }  
            }  
        }  
      
        /**
         * 将Bitmap保存本地JPG图片
         * @param url
         * @return
         * @throws IOException
         */  
        public static String saveBitmap2File(String url) throws IOException {  
      
            BufferedInputStream inBuff = null;  
            BufferedOutputStream outBuff = null;  
      
            SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");  
            String timeStamp = sf.format(new Date());  
            File targetFile = new File(Constants.ENVIROMENT_DIR_SAVE, timeStamp  
                    + ".jpg");  
            File oldfile = ImageLoader.getInstance().getDiscCache().get(url);  
            try {  
      
                inBuff = new BufferedInputStream(new FileInputStream(oldfile));  
                outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));  
                byte[] buffer = new byte[BUFFER];  
                int length;  
                while ((length = inBuff.read(buffer)) != -1) {  
                    outBuff.write(buffer, 0, length);  
                }  
                outBuff.flush();  
                return targetFile.getPath();  
            } catch (Exception e) {  
      
            } finally {  
                if (inBuff != null) {  
                    inBuff.close();  
                }  
                if (outBuff != null) {  
                    outBuff.close();  
                }  
            }  
            return targetFile.getPath();  
        }  
      
        /**
         * 读取表情配置文件
         *  
         * @param context
         * @return
         */  
        public static List<String> getEmojiFile(Context context) {  
            try {  
                List<String> list = new ArrayList<String>();  
                InputStream in = context.getResources().getAssets().open("emoji");// 文件名字为rose.txt  
                BufferedReader br = new BufferedReader(new InputStreamReader(in,  
                        "UTF-8"));  
                String str = null;  
                while ((str = br.readLine()) != null) {  
                    list.add(str);  
                }  
      
                return list;  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  
      
        /**
         * 获取一个文件夹大小
         *  
         * @param f
         * @return
         * @throws Exception
         */  
        public static long getFileSize(File f) {  
            long size = 0;  
            File flist[] = f.listFiles();  
            for (int i = 0; i < flist.length; i++) {  
                if (flist.isDirectory()) {  
                    size = size + getFileSize(flist);  
                } else {  
                    size = size + flist.length();  
                }  
            }  
            return size;  
        }  
      
        /**
         * 删除文件
         *  
         * @param file
         */  
        public static void deleteFile(File file) {  
      
            if (file.exists()) { // 判断文件是否存在  
                if (file.isFile()) { // 判断是否是文件  
                    file.delete(); // delete()方法 你应该知道 是删除的意思;  
                } else if (file.isDirectory()) { // 否则如果它是一个目录  
                    File files[] = file.listFiles(); // 声明目录下所有的文件 files[];  
                    for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件  
                        deleteFile(files); // 把每个文件 用这个方法进行迭代  
                    }  
                }  
                file.delete();  
            }  
        }  
    } 
  • 相关阅读:
    Maven 分模块,启动父工程时异常
    Maven SSH三大框架整合的加载流程
    Maven配置 和创建一个Maven项目
    课程8:《Maven精品教程视频》--视频目录
    salesforce零基础学习(九十三)Email To Case的简单实现
    salesforce零基础学习(九十二)使用Ant Migration Tool 实现Metadata迁移
    Salesforce Sales Cloud 零基础学习(四) Chatter
    Salesforce Sales Cloud 零基础学习(三) Lead & Opportunity & Quote
    Salesforce Sales Cloud 零基础学习(二) Account 和 Contact
    Salesforce Sales Cloud 零基础学习(一) Product 和 Price Book
  • 原文地址:https://www.cnblogs.com/java-g/p/4645869.html
Copyright © 2011-2022 走看看