如何将HashMap保存到文件并加载它



我遇到了一个大问题。我想保存一个HashMap(我将其称为'map'或'hm')到应用程序正在运行的android设备上的文件。我想把它保存在内部存储器上。

我知道像这样的问题以前被问过大约100个,我试了大约25个,但没有一个有效。

我有3个类,一个扩展'Activity'的主类和两个其他类,一个称为'util'。我想写两个方法,保存和加载HashMap,这两个方法都应该在'util'类中。在主类中,我编写了几个方法来加载HashMap,在其中放入一些内容,并再次保存它。

直到这里应该不难解决我的问题,但我想在主类之外的其他类中使用'save'和'load'方法。

我不知道如何在其他类中获得Context对象作为主类,所以我不知道如何调用openFileOutput()方法。

总结:我想保存和加载一个HashMap到/从一个文件,我想在内部存储上创建。我使用的方法应该位于'util'类中,并且应该可以被所有其他类访问,首选以静态方式。我尝试了许多不同的可能性,但我总是得到一个'FileNotFoundException'。我希望你能帮助我。

我使用的一些方法:

        try {
        FileOutputStream fos = c.openFileOutput(s, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(hm);
        oos.flush();
        oos.close();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

在这个方法中,我必须使用上下文,我不知道如何在其他类中获得它。我也得到一个'FileNotFoundException'…

String file = The path where my file should be located (I don't know how it should be given, but "data/data/[packagename]/[file]" does not work)
        try {
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(hm);
        oos.flush();
        oos.close();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

这个方法也不起作用,我真的不知道我得到了哪个异常。

最后:如果你想帮助我,请描述如何获得你使用的每个对象(好吧,除了基本的东西,如字符串等),并粘贴你的整个解决方案。我真的很抱歉,如果这个问题是之前问过的,我找不到。

编辑

我试图使用'this.getApplicationContext().getFilesDir()'方法,但仍然得到'FileNotFoundException'…不知道该怎么办

如果您总是从访问Activity的类中调用Util方法,只需在方法调用中添加Context作为参数。

否则,您可以创建一个全局Application -对象,从中您可以获得上下文。这个特定的上下文不支持创建视图和其他依赖于活动的选项,但是openFileOutput()/openFileInput()方法应该是好的,因为目录是在应用程序级别。

要做到这一点,你需要创建一个Application的子类,它有一个对自身的静态引用:

//In the Application subclass:
static MyApplication instance;
onCreate(){
    super.onCreate();
    instance = this;
}
public static final MyApplication getInstance(){
    return instance;
}

然后你可以调用MyApplication.getInstance();来获取上下文。

您还必须在清单中添加您的应用程序类(使用application标签下的name属性)。

相关阅读:android中的singleton vs ApplicationContext

最新更新