Android文件I / O.

时间:2012-04-19 21:20:39

标签: android file serialization

我希望我的应用程序在会话之间保存文件中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();
    }
}

导致错误的原因是什么?

2 个答案:

答案 0 :(得分:1)

您可以直接将children对象写入ObjectOutputStream。 ArrayList实现了serializable。您可能要做的第二件事是在使用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();

答案 1 :(得分:0)

您正在使用ObjectInputStream#readObject()返回null作为循环的退出条件。 #readObject()可以返回null - 如果您已序列化null - 如果因为您已到达流的末尾而无法读取对象,则会抛出异常。< / p>

快速简单的修复:在序列化子项之前,请考虑将数组的长度序列化为整数。使用for循环或类似的构造来读取值 - 或序列化ArrayList本身。它也是Serializable