2014-10-03 55 views
0

我知道有可能是噸這些四處走動(並相信我,我試了很多時,經歷了這個權利),但我似乎無法得到這個去。 我試圖將自定義對象(汽車)列表保存到本地存儲的文件中,稍後通過單擊按鈕加載它們。 我一直試圖使用FileOutputStream基於我讀過的很多來源。某些原因,當使用簡單的字符串列表進行測試時,它工作得很好,但是當涉及到我自制的對象時,我在嘗試保存時不斷收到IO異常。如果任何人都可以看看我的代碼,並告訴我我錯過了什麼(花費超過20小時試圖自己排除這個自己沒有運氣)。 P.S保存和加載方法被按鈕調用,它工作正常,所以代碼被忽略。Android Java保存到文件返回IOException

public class Main extends Activity implements OnClickListener{ 
public static List<Car> carList = new ArrayList<Car>(); 
String FILENAME = "carListFile"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button buttonView_saveb; 
    Button buttonView_loadb; 

    buttonView_saveb = (Button)findViewById(R.id.saveb); 
    buttonView_loadb = (Button)findViewById(R.id.loadb); 

    buttonView_saveb.setOnClickListener(this); 
    buttonView_loadb.setOnClickListener(this); 

    @Override 
    public void onClick(View view){ 
     switch (view.getId()){ 
      case R.id.saveb: 
      SaveData(); 
      break; 

      case R.id.loadb: 
      LoadData(); 
      break; 
     } 
    } 

    public void LoadData(){ 
     ArrayList<car> toReturn; 
     FileInputStream fis; 
     try { 
      fis = openFileInput(FILENAME); 
      ObjectInputStream oi = new ObjectInputStream(fis); 
      toReturn = (ArrayList<Car>) oi.readObject(); 
      oi.close(); 
     } catch (FileNotFoundException e) { 
      System.out.println("Failed to load, file '"+FILENAME+"' not found"); 
     } catch (ClassNotFoundException e) { 
      System.out.println("Failed to load from file '"+FILENAME+"', Class not found"); 
     } catch (IOException e) { 
      System.out.println("Failed to load from file '"+FILENAME+"', I/O Exception") 
     } 
    } 

    // this method return io exception, no idea why 
    public void SaveData(){ 
     try { 
      FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
      ObjectOutputStream of = new ObjectOutputStream(fos); 
      of.writeObject(diveLog); 
      of.flush(); 
      of.close(); 
     } catch (FileNotFoundException e) { 
      System.out.println("Failed to save, file '"+FILENAME+"' not found");  
     } catch (IOException e) { 
      System.out.println("Failed to save to file '"+FILENAME+"', I/O Exception"); 
     } 
    } 
} 

無論我做什麼,都會讓我獲得IO異常。 還注意到,我有一個按鈕,將汽車添加到列表,所以我不會保存一個空列表(雖然我不明白爲什麼應該重要)。

+0

你可以看到更多有關錯誤的詳細信息,例如e.printStackTrace() – CocoNess 2014-10-03 13:07:19

+0

嘗試發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – ericbn 2014-10-03 13:10:51

+0

你不是在FileInputStream上調用close(),也不在FileOutputStream上調用。你想打開一個已經打開(而不是關閉)的文件嗎? – Giovanni 2014-10-03 13:41:07

回答

0

感謝大家花時間幫助我。 因爲它似乎添加以下行後:

e.printStackTrace(); 

到異常捕手並按照logcat的輸出,我發現車不能被序列化。一個快速的研究表明,由於Car對象來自一個類(Car.java),因此該類必須實現「可序列化」才能進行序列化,然後進行反序列化。

在Car.java文件

這樣:

public class Car implements Serializable { 

我碰到一個很好的解釋來抓全過程,完美的人作爲新到Java,因爲我: https://www.youtube.com/watch?v=6MisF1sxBTo