0

セッション間でアプリが ArrayList からのデータをファイルに保持するようにします。私が使用するクラスは、Serializable を実装しています。私がデバッグすると、例外はスローされず、適切な回数ループを通過することなく、保存は問題ないようです。ロードすると、一部のエントリのみがロードされ、EOF 例外がスローされます。コードは次のとおりです。

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();
    }
}

エラーの原因は何ですか?

4

2 に答える 2

1

子オブジェクトを ObjectOutputStream に直接書き込むことができます。ArrayList はシリアライズ可能を実装します。2 つ目の方法は、ストリームを 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();
于 2012-04-19T21:27:55.090 に答える
0

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

すばやく簡単に修正するには、子をシリアル化する前に配列の長さを整数としてシリアル化し、for ループまたは同様の構造を使用して値を読み取るか、ArrayListそれ自体をシリアル化することを検討してください。それもSerializableです。

于 2012-04-19T21:29:02.477 に答える