android文件系统持久性

时间:2015-12-04 12:54:04

标签: android multithreading android-file datapersistance

嗨Iam有严重问题尝试将一些可序列化的对象保存到本地android文件系统上的文件中。我得到一个错误的文件描述符错误,我认为这与我的创建文件的方法有关。文件并检查文件是否存在。我在类中创建一个私有文件对象。然后,写或读。我用以下代码检查文件是否存在。

@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文档中也提到了这种方法,所以我认为这样做是合法的。

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时调用该活动。再次感谢!

2 个答案:

答案 0 :(得分:0)

1#:是的,它将返回您创建的原始文件。 2#:取决于你想要存储的东西,看起来File更偏向于描述

希望对你有所帮助。

答案 1 :(得分:0)

我们已经使用了

FileOutputStream fos = context.openFileOutput("file.ser", Context.MODE_PRIVATE);

编写我们的序列化文件。这将处理/data/data/app.package.name/files/中的文件。实际上,getFilesDir()返回此路径。

在反序列化时,使用

//确保传递传递给openFileOutput()的同一文件。   FileInputStream fis = context.openFileInput(“file.ser”);

此外,为避免文件名之间的混淆,您可以使用正在序列化的类的名称。

前:

public static <T> void serialize(final Context context, final T objectToSerialize) {
....
....
Strin fileName = objectToSerialize.getClass().getSimpleName();

...
}

执行此操作并将该方法保留在util中,以便它可用于任何类型的对象(T类型)进行序列化。