列表在app中是避免不了的,有些数据需要实时刷新,但是有些数据是不需要实时刷新的,或者数据一直是不变的,再者情况就是网络加载出错的时候,为了美观可以使用缓存数据应急等情况,这里用到的是Serializable 序列化进行数据的持久性缓存
下面是进行数据的保存
/**
* 保存对象
*
* @param ser
* @param fileName 文件名
* @throws IOException
*/
public static boolean saveObject(Context context, Serializable ser,
String fileName) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = context.openFileOutput(file, Context.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) {
}
}
}
存入的实体类都必须实现 Serializable 接口 ,否则会报错
这里每储存一次就会在/data/data/com.app.app/files 生成一个文件
数据的读取
/**
* 读取对象
*
* @param fileName 文件名
* @return
* @throws IOException
*/
public static Serializable readObject(Context context, String fileName) {
if (!isExistDataCache(context, file))
return null;
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = context.openFileInput(file);
ois = new ObjectInputStream(fis);
return (Serializable) ois.readObject();
} catch (FileNotFoundException e) {
} catch (Exception e) {
e.printStackTrace();
// 反序列化失败 - 删除缓存文件
if (e instanceof InvalidClassException) {
File data = context.getFileStreamPath(file);
data.delete();
}
} finally {
try {
ois.close();
} catch (Exception e) {
}
try {
fis.close();
} catch (Exception e) {
}
}
return null;
}
判断数据是否存在
/**
* 判断缓存是否存在
*
* @param fileName 文件名
* @return
*/
public static boolean isExistDataCache(Context context, String fileName) {
if (context == null)
return false;
boolean exist = false;
File data = context.getFileStreamPath(cachefile);
if (data.exists())
exist = true;
return exist;
}
删除文件
/**
* 删除缓存文件
*
* @param context
* @param fileName
*/
public static void delCacheFile(Context context, String fileName) {
File data = context.getFileStreamPath(cachefile);
data.delete();
}