0

嗨,我遇到了严重的问题,尝试将一些可序列化的对象持久化到本地 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 时调用该活动。再次感谢!

4

2 回答 2

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 类型)进行序列化。

于 2015-12-04T19:54:29.317 回答
0

1#:是的,它将返回您创建的原始文件。2#:取决于您要存储的东西,似乎文件从描述中更灵活

希望有帮助。

于 2015-12-04T13:11:51.497 回答