2013-06-11 22 views
2

我有一個Android應用程序,我想讀取和寫入ArrayList<MyClass>到內部存儲。從內部存儲讀取ArrayList

寫入的部分作品(我相信,沒有測試它尚未:-)):

ArrayList<MyClass> aList; 

    public void saveToInternalStorage() { 
    try { 
     FileOutputStream fos = ctx.openFileOutput(STORAGE_FILENAME, Context.MODE_PRIVATE); 
     fos.write(aList.toString().getBytes()); 
     fos.close(); 
    } 
    catch (Exception e) { 
     Log.e("InternalStorage", e.getMessage()); 
    } 
} 

但我想現在要做的是讀取存儲整個ArrayList和恢復它作爲一個ArrayList像這樣:

public ArrayList<MyClass> readFromInternalStorage() { 
     ArrayList<MyClass> toReturn; 
     FileInputStream fis; 
     try { 
      fis = ctx.openFileInput(STORAGE_FILENAME); 

      //read in the ArrayList 
      toReturn = whatever is read in... 

      fis.close(); 
     } catch (FileNotFoundException e) { 
      Log.e("InternalStorage", e.getMessage()); 
     } catch (IOException e) { 
      Log.e("InternalStorage", e.getMessage()); 
     } 
     return toReturn 
} 

我從來沒有讀過Android的文件之前,所以我不知道這是甚至可能的。 但是有沒有一種方法可以在我的自定義ArrayList中讀取?

回答

5

你必須序列化/反序列化對象:

你MyClass的必須implments序列化和裏面所有MyClass的成員都必須是可序列化

public void saveToInternalStorage() { 
     try { 
      FileOutputStream fos = ctx.openFileOutput(STORAGE_FILENAME, Context.MODE_PRIVATE); 
      ObjectOutputStream of = new ObjectOutputStream(fos); 
      of.writeObject(aList); 
      of.flush(); 
      of.close(); 
      fos.close(); 
     } 
     catch (Exception e) { 
      Log.e("InternalStorage", e.getMessage()); 
     } 
} 

反序列化對象:

public ArrayList<MyClass> readFromInternalStorage() { 
    ArrayList<MyClass> toReturn; 
    FileInputStream fis; 
    try { 
     fis = ctx.openFileInput(STORAGE_FILENAME); 
     ObjectInputStream oi = new ObjectInputStream(fis); 
     toReturn = oi.readObject(); 
     oi.close(); 
    } catch (FileNotFoundException e) { 
     Log.e("InternalStorage", e.getMessage()); 
    } catch (IOException e) { 
     Log.e("InternalStorage", e.getMessage()); 
    } 
    return toReturn 
} 
+0

似乎合法,但在oi.readObject()Eclipse給我一個「不能從對象轉換爲ArrayList 」類型不匹配......我猜投射到ArrayList 在這種情況下不會起作用嗎? –

+0

你可以安全地投下 – Blackbelt

+0

它正在工作:)現在我得到一個警告:類型安全:未經檢查的從對象投射到ArrayList 。而且MyClass的成員是[MarkerOption](http://developer.android.com/reference/com/google/android/gms/maps/model/MarkerOptions.html),似乎不是可序列化的...我可以使用Parcelable而不是Serializable來實現嗎? –