嗨,我遇到了严重的问题,尝试将一些可序列化的对象持久化到本地 android 文件系统上的文件中。我收到错误的文件描述符错误,我认为这与我创建文件的方法有关。文件并检查文件是否存在。我在类中创建了一个私有文件对象。然后,在写入或读取时。我使用以下代码检查文件是否存在。
@Override
public boolean fileExists() {
File file = context.getFileStreamPath(filename);
return file.exists();
}
这不会实例化我的名为“objectfile”的文件对象!!但确实检查“文件名”是否存在。
创建文件,如果“文件名”不存在,我调用此方法。
public void createFile()
{
objectfile = new File(context.getFilesDir(), filename);
objectfile.setReadable(true);
objectfile.setWritable(true);
}
我不确定这是否会返回我之前创建的文件,这将是我想要做的理想情况。有没有办法我可以获取旧文件或创建一个新文件并将其传递给构造函数中的“objectfile”变量?
我也想知道最好的方法是什么?还是我应该只使用mysqlite db?使用目标文件持久性现在对我来说似乎并不奏效,而且我正在努力赶上最后期限。在谷歌文档中也提到了这种方法,所以我认为这样做是合法的。
http://developer.android.com/training/basics/data-storage/files.html
这是我读取可序列化对象的方法
public synchronized ArrayList<RoomItem> readObjects() {
final ArrayList<RoomItem> readlist = new ArrayList<>();
if(!fileExists())
return readlist;
if(objectfile == null)
createFile();
try {
finputstream = new FileInputStream(objectfile);
instream = new ObjectInputStream(finputstream);
readwritethread = new Thread(new Runnable() {
@Override
public void run() {
try {
final ArrayList<RoomItem> readitems = (ArrayList<RoomItem>) instream.readObject();
instream.close();
finputstream.close();
handler.post(new Runnable() {
@Override
public void run() {
listener.updateList(readitems);
}
});
} catch(IOException e)
{
e.printStackTrace();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
Log.d("read failed", "file read failed");
}
}
});
}
catch(Exception e)
{
e.printStackTrace();
}
timeOutReadWrite(readwritethread);
readwritethread.start();
try {
readwritethread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("read from file", "file read");
return readlist;
如果有人能提出任何改进建议,我真的很感激。我使用处理程序传回我的活动并在我的活动上实现一个侦听器接口,当读取所有 obj 时调用该活动。再次感谢!