我有一个列表视图中显示的对象列表。另外,我有一个最喜欢的列表,用于将所选对象保存到共享首选项中。
当项目被标记为收藏时,我创建了一个方法,将在外部存储中创建该xml
文件的备份。
这是它的工作原理:
private void backupFav(){
String myPath = Environment.getExternalStorageDirectory().toString() +"/backup/";
try{
File myFile = new File(myPath, PREFS_NAME+".xml");
FileWriter fw = new FileWriter(myFile);
PrintWriter pw = new PrintWriter(fw);
Map<String,?> prefsMap = settings.getAll();
for(Map.Entry<String,?> entry : prefsMap.entrySet())
{
pw.println(entry.getKey() + ": " + entry.getValue().toString());
}
pw.close();
fw.close();
}
catch (Exception e){
// what a terrible failure...
Log.wtf(getClass().getName(), e.toString());
}
}
当项目被标记为收藏时,它将被调用:
private void saveFavorites(List<ProductLocal> favorites) {
String jsonFavorites = gson.toJson(favorites);
editor.putString(FAVORITES, jsonFavorites);
editor.apply();
backupFav();
}
到目前为止一切正常。
(有数百个项目,我在用户意外卸载我的应用程序时执行此操作,而不是丢失所有这些数据,所以我会在每次首次启动时检查并恢复备份数据)。
现在我的问题是从备份文件中读取数据。
public boolean restoreFav(Context context) {
boolean restored = false;
File src = new File(path2+PREFS_NAME+".xml");
ObjectInputStream input = null;
try {
input = new ObjectInputStream(new FileInputStream(src));
SharedPreferences.Editor prefEdit = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit();
prefEdit.clear();
Map<String, ?> entries = (Map<String, ?>) input.readObject();
for (Map.Entry<String, ?> entry : entries.entrySet()) {
Object v = entry.getValue();
String key = entry.getKey();
prefEdit.putString(key, ((String) v));
}
prefEdit.apply();
restored = true;
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
} finally {
try {
if (input != null) {
input.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return restored;
}
它不起作用。没有结果,没有输出。
请帮忙吗?
修改
经过调试后,我发现我得到了StreamCorruptedException
:
08-20 18:42:44.228: W/System.err(28802): java.io.StreamCorruptedException
08-20 18:42:44.238: W/System.err(28802): at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2115)
08-20 18:42:44.238: W/System.err(28802): at java.io.ObjectInputStream.<init>(ObjectInputStream.java:372)