【问题标题】:How to save HashMap to a file and load it如何将 HashMap 保存到文件并加载它
【发布时间】:2013-03-26 18:33:14
【问题描述】:

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

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

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

到这里解决我的问题应该不难,但我想在除主类之外的其他类中使用“保存”和“加载”方法。

不知道如何获取其他类中的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”...不知道该怎么办。

【问题讨论】:

  • "我真的不知道我遇到了哪个异常..." 如果您希望我们帮助您,这就是我们需要的信息...只是运行您的代码并复制/粘贴堆栈跟踪。这是你至少可以做的......
  • 您的Map 中包含哪些类型? Hashmap<String, String>?
  • 是的,字符串和整数。有时是我的 Enum 类的一种。如果你不(不知道怎么说)把东西放在那些< / >里,把不同类型的对象放在一个HashMap里会不会有问题?
  • 好吧,我尝试使用这些方法运行我的应用程序:PasteBin Link 并且使用路径 "data/data/at.enagon.micromon/micromon" 得到了几个 'FileNotFoundExceptions' 。 'at.enagon.micromon' 是我的主要包。

标签: java android file save


【解决方案1】:

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

否则,您可以创建一个全局Application-object,您可以从中获取上下文。这个特定的 Context 不支持创建视图和其他依赖于 Activity 的选项,但 openFileOutput()/openFileInput()-methods 应该没问题,因为该目录位于应用程序级别。

为此,您将创建一个应用程序的子类,并对其自身进行静态引用:

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

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

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

相关阅读: Singletons vs ApplicationContext in android

【讨论】:

  • 谢谢,这对我很有帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2014-11-18
  • 2015-12-08
  • 2017-05-14
  • 2016-03-25
相关资源
最近更新 更多