以前保存本地我只会用到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() ; //这个方法最后就是删除掉目标文件
}
}