【发布时间】:2014-09-14 16:40:13
【问题描述】:
我有一个自定义对象类Record 实现了Parcelable,我正在通过ArrayAdapter<Record> 创建一个ListView 我希望能够保存该列表,以便在用户下次打开时自动加载应用程序。该列表是动态填充的,每次添加记录时我都会调用我的保存方法。然后我有一个SharedPreference,它的布尔值设置为true,这样我就知道用户已经保存了一些数据,以便在下次打开应用程序时加载。这是我的保存和加载方法:
public void writeRecordsToFile(ArrayAdapter<Record> records) {
String fileName = Environment.getExternalStorageDirectory().getPath() + "/records.dat";
try {
File file = new File(fileName);
if(!file.exists()){
file.createNewFile();
}
ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(file));
stream.writeObject(records);
stream.flush();
stream.close();
}
catch (IOException e){
Log.e("MyApp","IO Exception: " + e);
}
writeSavedState();
}
writeSavedState() 是我的SP
public void readRecordsList() {
String fileName = Environment.getExternalStorageDirectory().getPath() + "/records.dat";
try {
ObjectInputStream inputStream = new ObjectInputStream(getApplicationContext().openFileInput(fileName));
adapter = (ArrayAdapter<Record>)inputStream.readObject();
inputStream.close();
}
catch (Exception e){
Log.e("MyApp" , "File Not Found: " + e);
}
}
当我第一次打开应用程序时,我收到一条消息:
E/MyApp﹕ File Not Found: java.lang.IllegalArgumentException: File /storage/emulated/0/records.dat contains a path separator
然后当我将Record 添加到我的列表中时,我会收到以下消息:
E/MyApp﹕ IO Exception: java.io.IOException: open failed: EACCES (Permission denied)
我假设我收到第二条消息是因为第一条消息。这是我第一次在 Android 中使用 I/O,因此我们将不胜感激!
编辑
将权限添加到清单后,我现在只收到一个错误:
E/MyApp﹕ IO Exception: java.io.NotSerializableException: android.widget.ArrayAdapter
正如我所说,我的自定义对象是Parcelable,其余部分在我的MainActivity 中完成。我是否需要创建一个名为 Serializable 的新课程来构建我的 ArrayAdapter?
【问题讨论】:
-
你不需要使用getPath(),Environment.getExternalStorageDirectory()会返回外部存储目录的路径。您是否还在清单文件中设置了读/写权限?
-
根据数据对象的复杂程度,你为什么不把所有的东西都写到共享首选项中。不仅仅是布尔值,而是实际数据
-
@akshay7692 实际上我还没有这样做,好电话。我会尝试,但我认为它不会修复我的第一条消息
-
@PattaFeuFeu 我想我可以这样做,但我认为这不会解决我的问题
-
@erik 我确实尝试过先这样做,但我的列表的大小可能会有所不同,并且为此使用共享首选项变得太复杂了
标签: android io android-file