9

在我的 Android 应用程序中,我试图存储一个 Map 结构,例如:Map<String, Map<String, String>>使用内部存储。我已经研究过 using SharedPreferences,但如您所知,这仅在存储原始数据类型时有效。我尝试使用FileOutputStream,但它只能让我以字节为单位写入......我是否需要以某种方式序列化 Hashmap 然后写入文件?

我试过阅读http://developer.android.com/guide/topics/data/data-storage.html#filesInternal但我似乎找不到我的解决方案。

这是我正在尝试做的一个例子:

private void storeEventParametersInternal(Context context, String eventId, Map<String, String> eventDetails){

Map<String,Map<String,String>> eventStorage = new HashMap<String,Map<String,String>>();
Map<String, String> eventData = new HashMap<String, String>();
String REQUEST_ID_KEY = randomString(16);
.   //eventData.put...
.   //eventData.put...
eventStorage.put(REQUEST_ID_KEY, eventData);
FileOutputStream fos = context.openFileOutput(EVENT_FILENAME, Context.MODE_PRIVATE);
fos.write(eventStorage) //This is wrong but I need to write to file for later access..

}

在 Android 应用程序内部存储这种类型的数据结构的最佳方法是什么?抱歉,如果这似乎是一个愚蠢的问题,我对 Android 很陌生。提前致谢。

4

3 回答 3

18

HashMap是可序列化的,因此您可以将FileInputStreamFileOutputStreamObjectInputStreamObjectOutputStream结合使用。

要将您写入HashMap文件:

FileOutputStream fileOutputStream = new FileOutputStream("myMap.whateverExtension");
ObjectOutputStream objectOutputStream= new ObjectOutputStream(fileOutputStream);

objectOutputStream.writeObject(myHashMap);
objectOutputStream.close();

HashMap从文件中读取:

FileInputStream fileInputStream  = new FileInputStream("myMap.whateverExtension");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

Map myNewlyReadInMap = (HashMap) objectInputStream.readObject();
objectInputStream.close();
于 2013-07-18T16:03:07.860 回答
2

史蒂夫 P 的回答 +1,但它不能直接工作,在阅读时我得到一个 FileNotFoundException,我试过这个并且效果很好。

来写,

try 
{
  FileOutputStream fos = context.openFileOutput("YourInfomration.ser", Context.MODE_PRIVATE);
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  oos.writeObject(myHashMap);
  oos.close();
} catch (IOException e) {
  e.printStackTrace();
}

并阅读

try 
{
  FileInputStream fileInputStream = new FileInputStream(context.getFilesDir()+"/FenceInformation.ser");
  ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
  Map myHashMap = (Map)objectInputStream.readObject();
}
catch(ClassNotFoundException | IOException | ClassCastException e) {
  e.printStackTrace();
}
于 2016-02-04T18:30:17.660 回答
0

写作:

FileOutputStream fos = context.openFileOutput(EVENT_FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream s = new ObjectOutputStream(fos);
s.writeObject(eventStorage);
s.close();

读取以相反的方式完成,并在 readObject 中转换为您的类型

于 2013-07-18T16:03:00.193 回答