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("\r\n");
            }
        } 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();
        }
    }
} 
时间: 2024-11-14 11:08:11

android文件缓存管理的相关文章

android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决

1.相关代码: 加入权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> /** 获取SD卡路径 **/ private static String getSDPath() { St

android 文件缓存工具类

/** * Json数据缓存的工具类 * */public class CacheDataSd { /** * * @param context 当前对象 * @param dir 创建的文件 * @param requesturl 标志字段 * @param jsondata json数据 */ public static void SaveSDByteArray(Context context, String dir, String requesturl, String jsondata)

Android文件夹管理器源码实现

一.资源管理器介绍 现在在一些移动终端上面都会有自带的资源管理器,其实其并非是Android系统自带,而是手机产商与app开发商的合作而导致融合,借助第三方的开发软件预装在出厂的手机,是新时代下的另一个霸王条款,还不能自行删除,十分麻烦. 背景铺垫完毕,由于十分讨厌这种不公平的手段,为此自行写一个实现文件资源管理器,功能基本上实现,实用不美观,不喜勿喷! 二.实现函数详解 1.显示文件列表 /** * 扫描显示文件列表 * @param path */ private void showFile

Android 数据缓存-文件存储

Android APP开发过程中,我们通常会加入缓存模块.缓存即在本地保存APP的一些数据,大部分是将网络请求的数据进行本地保存,这样在缓存数据有效期内就可以直接使用缓存数据,降低了APP和服务器的压力,也极大提升了用户体验.Android数据缓存既可以以数据表的形式进行保存,也可以以文件的形式进行缓存.这里我主要通过缓存文件存储数据,并在APP下一次启动时读取. Usage 整个Cache模块的设计思想很简单,每个缓存数据都对应一个key,每个缓存数据又会被存到以此key命名的文件中,需要时直

Android结合volley的netWorkImageview实现图片文件缓存

在写Android应用程序时经常会用到图片缓存,对于网络请求使用Android平台上的网络通信库Volley,能使网络通信更快,更简单,更健壮,而且Volley特别适合数据量不大但是通信频繁的场景,所以可以使用volley来请求网络图片.接下来就将本人在一个项目中的图片缓存模块拿出来跟大家分享,欢迎批评指正. /** * @author * @date 2015/4/14 * 利用文件缓存图片 */ public class ImageFileCacheUtils { private stati

(转)Android技术积累:图片缓存管理

如果每次加载同一张图片都要从网络获取,那代价实在太大了.所以同一张图片只要从网络获取一次就够了,然后在本地缓存起来,之后加载同一张图片时就从缓存中加载就可以了.从内存缓存读取图片是最快的,但是因为内存容量有限,所以最好再加上文件缓存.文件缓存空间也不是无限大的,容量越大读取效率越低,因此可以设置一个限定大小比如10M,或者限定保存时间比如一天. 因此,加载图片的流程应该是: 先从内存缓存中获取,取到则返回,取不到则进行下一步: 从文件缓存中获取,取到则返回并更新到内存缓存,取不到则进行下一步:

Android 编程之入门开发文件夹管理器开发详细讲解-1

在我们的手持设备中,一般都会自带设备公司自己开发的文件管理系统.拍照系统之类的东东,今天我给大伙说说入门级开发的文件夹管理器,代码贼少 总共就6个类吧,没有夹杂其他外部应用,就是一个纯文件夹管理器 APP主要功能设计:文件复制.文件夹复制.批量文件/文件夹复制.删除文件.删除文件夹.批量删除文件/文件夹.文件分类.文件搜索暂时没有写, 有兴趣的可以自己写写 APP主要应用:DrawerLayout .ListView.Fragment.IO.序列化.文件过滤.文件排序.ActionBar.Ada

Android 编程之入门开发文件夹管理器开发文件的过滤与排序-3

前面说了文件操作和主界面,接下来说说文件的过滤和排序,我们都知道在我们的设备里,不管是PC还是手机,总有一些我们 看不到的文件夹,那就是所谓的隐藏文件,大部分的隐藏文件,我们是没有权限操作的,所有对我们来说没必要,必须干掉, 还有就是给文件列表排序,方面查找,其实在现在的文件夹管理里,不知道大家有没有发现,就是在界面的最右或者最左边有 一个从A-Z竖向排列的选项,点击每个字母,它会跳到以那个字开头的文件列表项去,这是比较好用的一款东西,因为APP是之 前写的,也就没用到新式的东西了,咱们就说说粗

Android 编程之入门开发文件夹管理器开发抽屉与文件分类-4

在此文件夹管理APP里,我们可以尝试引用一些新的元素,在这里我给打击介绍一个叫抽屉的布局,QQ就用到了抽屉布局,不 过他们又在原有的基础上自己开发了新的抽屉布局,并且还蛮高大上的,顺便说说分类管理,这些都只是很初步的一些写法, 因为是前期写的,后期就没做完善了,适合一般入门级伙伴学习,首先给大家说说抽屉布局,还是以图形的方式介绍比较好 抽屉布局示例,点击红色方框按钮即可弹出抽屉布局,或者顺势向右划屏也可以弹出抽屉布局: 弹出布局: 文件管理文类: 图片分类: 音乐分类: 视频分类: 对后缀类型匹