android文件系统持久性
Hi-Iam遇到严重问题,请尝试将一些可序列化对象持久化到本地android文件系统上的文件中。我收到一个错误的文件描述符错误,我想这与我创建文件的方法有关。文件,并检查该文件是否存在。我在类中创建了一个私有文件对象。然后,写或读。我用下面的代码检查文件是否存在android文件系统持久性,android,multithreading,android-file,datapersistance,Android,Multithreading,Android File,Datapersistance,Hi-Iam遇到严重问题,请尝试将一些可序列化对象持久化到本地android文件系统上的文件中。我收到一个错误的文件描述符错误,我想这与我创建文件的方法有关。文件,并检查该文件是否存在。我在类中创建了一个私有文件对象。然后,写或读。我用下面的代码检查文件是否存在 @Override public boolean fileExists() { File file = context.getFileStreamPath(filename); return file.exists()
@Override
public boolean fileExists() {
File file = context.getFileStreamPath(filename);
return file.exists();
}
这不会实例化名为“objectfile”的文件对象!!但请检查“文件名”是否存在
要创建文件,如果“filename”不存在,我调用这个方法
public void createFile()
{
objectfile = new File(context.getFilesDir(), filename);
objectfile.setReadable(true);
objectfile.setWritable(true);
}
我不确定这是否会给我以前创建的文件,这将是理想的我想做的。是否有一种方法可以直接获取旧文件或创建一个新文件并将其传递给构造函数中的“objectfile”变量
我也想知道最好的方法是什么??
或者我应该只使用mysqlite数据库吗?使用对象文件持久性目前对我来说似乎不太合适,我的工作已经到了最后期限。gooogle文档中也提到了这种方法,所以我认为这样做是合法的
下面是我读取可序列化对象的方法
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;
public synchronized ArrayList readObjects(){
最终ArrayList readlist=新ArrayList();
如果(!fileExists())
返回可读列表;
if(objectfile==null)
createFile();
试一试{
finputstream=新文件输入流(objectfile);
instream=新的ObjectInputStream(finputstream);
readwritethread=新线程(new Runnable(){
@凌驾
公开募捐{
试一试{
最终ArrayList readitems=(ArrayList)instream.readObject();
流内关闭();
finputstream.close();
handler.post(新的Runnable(){
@凌驾
公开募捐{
updateList(readitems);
}
});
}捕获(IOE异常)
{
e、 printStackTrace();
}
catch(classnotfounde异常)
{
e、 printStackTrace();
Log.d(“读取失败”、“文件读取失败”);
}
}
});
}
捕获(例外e)
{
e、 printStackTrace();
}
timeOutReadWrite(readwritethread);
readwritethread.start();
试一试{
readwritethread.join();
}捕捉(中断异常e){
e、 printStackTrace();
}
Log.d(“从文件读取”、“文件读取”);
返回可读列表;
如果有人能提出任何改进建议,我真的很感激。我使用一个处理程序传回我的活动,并在我的活动上实现一个侦听器接口,在读取所有obj时调用该活动。再次感谢!1\:是的,它将返回您创建的原始文件。
2#:根据您要存储的内容,从描述来看,文件似乎更灵活
希望对您有所帮助。我们使用过
FileOutputStream fos = context.openFileOutput("file.ser", Context.MODE_PRIVATE);
写入序列化文件。这将插入/data/data/app.package.name/files/中的文件。事实上,此路径由getFilesDir()返回
在反序列化时,使用
//确保传递的文件与传递给openFileOutput()的文件相同。。
FileInputStream fis=context.openFileInput(“file.ser”)
另外,为了避免文件名之间的混淆,可以使用正在序列化的类的名称
例:
publicstaticvoidserialize(最终上下文,最终T objectToSerialize){
....
....
Strin fileName=objectToSerialize.getClass().getSimpleName();
...
}
执行此操作并将该方法保留在util中,以便它可以用于任何类型的对象(T类型)要序列化。您是否尝试过使用
随机访问文件
?或者,您是否尝试过将数据存储在SQLite数据库中?是否尝试过随机访问文件。听起来有点随机!?我想一致地读写同名文件它被称为随机访问文件
,因为您不必从字节0读到EOF,但是如果您愿意,请不要从中间开始读取部分内容。这并不意味着对它的访问是随机的;它只是意味着允许对文件进行随机访问。如果在文件系统“objectfile=new file(context.getFilesDir(),filename);”中找到相同的文件,此命令是否会返回给我?????
public static <T> void serialize(final Context context, final T objectToSerialize) {
....
....
Strin fileName = objectToSerialize.getClass().getSimpleName();
...
}