2011-12-15 21 views
5

如何將我的Map<Integer, String>轉換爲byte[],然後將其寫入內部存儲?我目前有:如何將地圖轉換爲字節並保存到內部存儲

 try { 
      FileOutputStream fos = context.openFileOutput(Const.FILE_CATEGORIES, Context.MODE_PRIVATE); 
      fos.write(null); 
     } catch (FileNotFoundException e) { 
      // reload and create the file again 
     } 

But..I不知道如何讓Map成正確的格式,然後它到它的原始格式,一旦我需要重新加載解碼回來。我需要每週重新創建一次該文件,並在應用程序啓動時加載它。

回答

14
  1. 使用序列在Java中,你可以輕鬆地分析任何可序列化 對象字節流。嘗試使用ObjectInputStream和ObjectOuputStream。

  2. 使用json進行恢復。您可以使用google-gson將Java 對象轉換爲JSON,反之亦然。

  3. 在android中使用包裹。 android.os.Parcel類設計爲在android(activity,service)中的組件之間傳遞數據 ,但您仍然可以使用它來執行數據持久性。 只要記住不要將數據發送到互聯網,因爲差異 平臺可能有不同的算法來解析。

我寫了一個序列化的演示,試試看。

public static void main(String[] args) throws Exception { 
    // Create raw data. 
    Map<Integer, String> data = new HashMap<Integer, String>(); 
    data.put(1, "hello"); 
    data.put(2, "world"); 
    System.out.println(data.toString()); 

    // Convert Map to byte array 
    ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); 
    ObjectOutputStream out = new ObjectOutputStream(byteOut); 
    out.writeObject(data); 

    // Parse byte array to Map 
    ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); 
    ObjectInputStream in = new ObjectInputStream(byteIn); 
    Map<Integer, String> data2 = (Map<Integer, String>) in.readObject(); 
    System.out.println(data2.toString()); 
} 
+0

該方法的缺點是,如果地圖類發生更改,則所有持久值均無效。 – belgther 2011-12-15 09:04:55

0

要麼像序列提到faylon,或實現自己的機制,以保存和載入地圖。通過保存,您遍歷所有元素並保存鍵值對。通過加載,你可以將它們添加回來。實現自己的機制的優點是,當您的程序與另一個Java版本一起使用時,仍然可以使用持久化值。

相關問題