在我的Android应用程序中,我正在尝试使用内部存储来存储地图结构,例如:Map<String, Map<String, String>>
。我已经研究过使用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 App中内部存储此类数据结构的最佳方法是什么?对不起,如果这看起来像一个愚蠢的问题,我对Android很新。提前谢谢。
答案 0 :(得分:16)
HashMap
是可序列化的,因此您可以将FileInputStream和FileOutputStream与ObjectInputStream和ObjectOutputStream结合使用。
将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();
答案 1 :(得分:2)
为Steve 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();
}
答案 2 :(得分:0)
写作:
FileOutputStream fos = context.openFileOutput(EVENT_FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream s = new ObjectOutputStream(fos);
s.writeObject(eventStorage);
s.close();
以相反的方式完成读取并在readObject
中转换为您的类型