【问题标题】:Read an ArrayList from Internal Storage从内部存储中读取 ArrayList
【发布时间】:2013-06-11 15:08:45
【问题描述】:

我有一个 Android 应用程序,我想在内部存储中读取和写入 ArrayList<MyClass>

写作部分有效(我相信,还没有测试过:-)):

ArrayList<MyClass> aList;

    public void saveToInternalStorage() {
    try {
        FileOutputStream fos = ctx.openFileOutput(STORAGE_FILENAME, Context.MODE_PRIVATE);
        fos.write(aList.toString().getBytes());
        fos.close();
    }
    catch (Exception e) {
        Log.e("InternalStorage", e.getMessage());
    }
}

但我现在要做的是从存储中读取整个 ArrayList 并将其作为 ArrayList 返回,如下所示:

public ArrayList<MyClass> readFromInternalStorage() {
        ArrayList<MyClass> toReturn;
        FileInputStream fis;
        try {
            fis = ctx.openFileInput(STORAGE_FILENAME);

            //read in the ArrayList
            toReturn = whatever is read in...

            fis.close();
        } catch (FileNotFoundException e) {
            Log.e("InternalStorage", e.getMessage());
        } catch (IOException e) {
            Log.e("InternalStorage", e.getMessage()); 
        }
        return toReturn
}

我以前从未使用 Android 读取过文件,所以我不知道这是否可能。 但是有没有一种方法可以让我在我的自定义ArrayList 中阅读?

【问题讨论】:

    标签: android arraylist storage fileinputstream


    【解决方案1】:

    你必须序列化/反序列化你的对象:

    你的 MyClass 必须实现 Serializable 并且 MyClass 中的所有成员都必须是可序列化的

     public void saveToInternalStorage() {
            try {
                FileOutputStream fos = ctx.openFileOutput(STORAGE_FILENAME, Context.MODE_PRIVATE);
                ObjectOutputStream of = new ObjectOutputStream(fos);
                of.writeObject(aList);
                of.flush();
                of.close();
                fos.close();
            }
            catch (Exception e) {
                Log.e("InternalStorage", e.getMessage());
            }
    }
    

    反序列化对象:

    public ArrayList<MyClass> readFromInternalStorage() {
        ArrayList<MyClass> toReturn;
        FileInputStream fis;
        try {
            fis = ctx.openFileInput(STORAGE_FILENAME);
            ObjectInputStream oi = new ObjectInputStream(fis);
            toReturn = oi.readObject();
            oi.close();
        } catch (FileNotFoundException e) {
            Log.e("InternalStorage", e.getMessage());
        } catch (IOException e) {
            Log.e("InternalStorage", e.getMessage()); 
        }
        return toReturn
    } 
    

    【讨论】:

    • 似乎合法,但在 oi.readObject() Eclipse 给我一个“无法从 Object 转换为 ArrayList”类型不匹配...我猜想转换为 ArrayList 不会在这种情况下也不行吗?
    • 它正在工作 :) 现在我确实收到了一个警告:类型安全:未经检查的从 Object 转换为 ArrayList。还有一个 MyClass 的成员是 MarkerOption,这似乎是不可序列化的......我可以用 Parcelable 而不是 Serializable 实现相同的目标吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多