利用serializable将对象保存到本地

来源:互联网 发布:php 获取图片拍摄地点 编辑:程序博客网 时间:2024/06/07 23:35
以前保存本地我只会用到SQLite,xml和sp。
今天大佬突然说你不会归档吗?(大佬是ios的),我说什么是归档,结果一查,就是安卓的 序列化serializable

我以前只会在acitivity跳转传对象的时候才会用到serializable,原来serializable还有将对象保存本地的作用,具体思想就是将对象序列化之后,用file文件读写方式将序列化后的对象保存到外部存储,原理上还是用文件存储的方式。

用法:
1.首先声明一个类,这个类和里面的所有内部类都要implements serializable
public class VolunteerListBean implements Serializable{
   
    private List<ConsulterListBean> consulterList;

    public List<ConsulterListBean> getConsulterList() {
        return consulterList;
    }

    public void setConsulterList(List<ConsulterListBean> consulterList) {
        this.consulterList = consulterList;
    }
    public static class ConsulterListBean implements Serializable{

        private String college;
        private String major;
        private String id;

        public String getCollege() {
            return college;
        }

        public void setCollege(String college) {
            this.college = college;
        }

        public String getMajor() {
            return major;
        }

        public void setMajor(String major) {
            this.major = major;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }
    }
}

假设有一个志愿者数组的类,内部又有各个志愿者的类,它们都implements serializable

然后在activity中new出志愿者数组的对象,各种set get之后就可以调用存储方法了
//将志愿者按照学校名保存到本地
public void saveVolunteers(VolunteerListBean volunteerListBeanString schoolName) throws IOExceptionClassNotFoundException {
    String path = Constant.VOLUNTEERS_DIR + File.separator + schoolName + ".data";//设置路径
    FileOutputStream fileOutputStream;//打开文件输出流
    ObjectOutputStream objectOutputStream;//打开对象输出流
    File file = new File(path);//新建文件
    if (!file.getParentFile().exists()) {
        file.getParentFile().mkdirs();
    }
    if (file.exists()) {
        file.delete();
    }
    file.createNewFile();
   
    fileOutputStream = new FileOutputStream(file.toString());//将新建的文件写入文件输出流
    objectOutputStream = new ObjectOutputStream(fileOutputStream);//向对象输出流写入文件输出流
    objectOutputStream.writeObject(volunteerListBean);//将序列化后的对象写入对象输出流
    objectOutputStream.close();//关闭对象输出流
    fileOutputStream.close();//关闭文件输出流
}
然后就能在对应的文件夹里面看到.data文件了

接着就是读文件了
//读取志愿者,根据学校名
public VolunteerListBean getVolunteers(String schoolName) throws IOExceptionClassNotFoundException {
    String path = Constant.VOLUNTEERS_DIR + File.separator + schoolName + ".data";//设置路径
    VolunteerListBean volunteerListBean;//声明对象
    File file = new File(path);//新建文件
    if (!file.getParentFile().exists()) {
        file.getParentFile().mkdirs();
    }
    if (file.exists()) {
        //如果文件存在
        FileInputStream fileInputStream;//打开文件输入流
        ObjectInputStream objectInputStream;//打开对象输入流
        fileInputStream = new FileInputStream(file.toString());//将新建的文件写入文件输入流
        objectInputStream = new ObjectInputStream(fileInputStream);//将文件输入流写入对象输入流
        volunteerListBean = (VolunteerListBean) objectInputStream.readObject();//获取对象输入流的对象
        objectInputStream.close();//关闭对象输入流
        fileInputStream.close();//关闭文件输入流
        return volunteerListBean;
   else {
        return null;
    }
}

下面还有个小tip,利用递归删除指定文件夹(包括里面所有文件)
//删除文件夹
public void deleteDir(File file){
        if (file.isFile()) {
            //如果是文件的话
            file.delete();
            return;
        }
        if (file.isDirectory()) {
            //如果是文件夹的话
            File[] childFile = file.listFiles();//获取这个文件夹里面的所有文件(包括文件夹)
            if (childFile == null || childFile.length == 0) {
               //如果这个文件夹没有子文件或者文件夹的话,就删除掉这个文件(文件夹)
                file.delete();
                return;
            }
            for (File f : childFile) {
                //递归这个方法
                deleteDir(f);
            }
            file.delete();//这个方法最后就是删除掉目标文件
        }
}


原创粉丝点击