2012-04-19 9 views
0

私のアプリケーションでは、セッション間のファイルでArrayListのデータを保持します。クラスIはSerializableを実装しています。私が保存をデバッグするときに例外がスローされずにOKになり、ループを適切な回数実行しているようです。ロードすると、エントリの一部だけが読み込まれ、EOF例外がスローされます。コードはここにある:AndroidファイルI/O

public int saveChildren(Context context){ 
    FileOutputStream fos; 
    ObjectOutputStream os; 
    try { 
     fos = context.openFileOutput(filename, Context.MODE_PRIVATE); 
     os = new ObjectOutputStream(fos); 
     for(Child c : children){ 
      os.writeObject(c); 
     } 
     os.close(); 
    } 
    catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return 1; 
    } 
    catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return 2; 
    } 
    return 0; 
} 

public void loadChildren(Context context){ 

    FileInputStream fis; 
    try { 
     fis = context.openFileInput(filename); 
     ObjectInputStream is; 
     is = new ObjectInputStream(fis); 
     while(is.readObject() != null){ 
      Child c = (Child) is.readObject(); 
      boolean skip = false; 
      for(Child ch: children){ 
       if(ch.getName().equals(c.getName())){ 
        skip = true; 
       } 
       if(ch.getNr().equals(c.getNr())){ 
        skip = true; 
       } 
       if(ch.getImei() != null){ 
        if(ch.getImei().equals(c.getImei())){ 
         skip = true; 
        } 
       } 
      } 
      if(!skip){ 
       children.add(c); 
      } 
     } 
     is.close(); 
    }catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (StreamCorruptedException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    }catch (OptionalDataException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

エラーの原因は何?

答えて

1

子オブジェクトをObjectOutputStreamに直接書き込むことができます。 ArrayListはシリアライズ可能です。もう1つは、ストリームをos.flush()で閉じる前にフラッシュすることです。あなたは持っています:

os = new ObjectOutputStream(fos);  
os.writeObject(children);  
os.flush(); 
os.close(); 

と読書のための:

is = new ObjectInputStream(fis); 
ArrayList<Child> children = (ArrayList<Child>)is.readObject(); 
is.close(); 
+0

私はそれを試みましたが、結果としてアクティビティがシャットダウンしました。 – hubert

+0

修正、それは動作します。以前のフォーマットでシリアル化されたデータをロードしようとしたため、以前は失敗しました。本当にありがとう。 – hubert

+0

それが助けて嬉しい:) – azertiti

0

あなたはループの終了条件としてnullを返すObjectInputStream#readObject()を使用しています。 #readObject()nullを返すことができます。nullをシリアル化した場合、ストリームの最後に到達したためにオブジェクトの読み取りに失敗した場合は例外がスローされます。

子孫をシリアル化する前に、配列の長さを整数として直列化することを検討してください。& forループまたは同様の構文を使用して値を読み取るか、ArrayListを直列化します。それはまたSerializableです。

関連する問題