我希望我的应用程序在会话之间保存文件中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();
}
}
导致错误的原因是什么?
答案 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
。