oschina安卓源代码解析(五)两个文件缓存的方法

这里讲下缓存:
一般缓存有几种:1、用数据库来做缓存sqlite 2、另外一种是文件缓存
我这里讲下os的文件缓存。
基本上是这样:从服务器读取数据时候,譬如读取前几节讲的news新闻内容,读取之后把xml转换成数据流,
再把数据流转换为新闻实体类的集合。拿到这个实体类的集合List<News> 之后我们就把它保存下来,生成一个文本文件。

这节讲得就是怎么把List<News>转换成一个文件放在手机里面

/**
         * 保存对象 缓存 ser变成file文件
         * @param ser
         * @param file
         * @throws IOException
         */
        public boolean saveObject(Serializable ser, String file) {
                //文件输出流
                FileOutputStream fos = null;
                //对象输出流
                ObjectOutputStream oos = null;
                try{
                        fos = openFileOutput(file, MODE_PRIVATE);
                        oos = new ObjectOutputStream(fos);
                        oos.writeObject(ser);
                        oos.flush();
                        return true;
                }catch(Exception e){
                        e.printStackTrace();
                        return false;
                }finally{
                        try {
                                oos.close();
                        } catch (Exception e) {}
                        try {
                                fos.close();
                        } catch (Exception e) {}
                }
        }

上面代码的关键就是 openFileOutput这个方法,方法有两个参数,第一个是文件名,第二个是创建的这个文件属性,这个文件是否
为其他app文件访问。
这个方法创建的文件将放在手机的data/data/包名/files/file下面
最后一个file就是上面的文件名,所以上面的方法是实现了把List<News>转化成data/data/包名/files/file文件
我们只要调用 saveObject这个方法,把实体类或者集合放进去就可以生成一个文件。
那我们怎么下次再读取此文件并把文件内容转换成一个实体类或者集合呢

/**
         * 读取对象
         * @param file
         * @return
         * @throws IOException
         */
        public Serializable readObject(String file){
                if(!isExistDataCache(file))
                        return null;
                FileInputStream fis = null;
                ObjectInputStream ois = null;
                try{
                        fis = openFileInput(file);
                        ois = new ObjectInputStream(fis);
                        return (Serializable)ois.readObject();
                }catch(FileNotFoundException e){
                }catch(Exception e){
                        e.printStackTrace();
                        //反序列化失败 - 删除缓存文件
                        if(e instanceof InvalidClassException){
                                File data = getFileStreamPath(file);
                                data.delete();
                        }
                }finally{
                        try {
                                ois.close();
                        } catch (Exception e) {}
                        try {
                                fis.close();
                        } catch (Exception e) {}
                }
                return null;
        }

上面这个就可以清楚看到java的反序列化的操作,把一个文件读取并转换成一个实体类
============================
说了这么多,其实缓存就是把网络地址以xml读取时候,生成一个文件放在手机data/data/包名/files/下面
等下次再读取时候,就不用再去服务器请求,一个是读取数据更快,还有一个省了读取网络数据的流量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值