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

来源:互联网 发布:网络超级红人节盛典 编辑:程序博客网 时间:2024/04/27 18:43
这里讲下缓存:
一般缓存有几种: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
原创粉丝点击