天天看点

利用serializable将对象保存到本地

以前保存本地我只会用到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 volunteerListBean , String schoolName)  throws IOException , ClassNotFoundException {

    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 IOException , ClassNotFoundException {

    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() ; //这个方法最后就是删除掉目标文件

        }

}

继续阅读