【发布时间】:2016-05-16 02:44:32
【问题描述】:
我正在将序列化对象写入文件并在 android 中读取它。 我在从文件中读取第二个对象时收到“java.io.StreamCorruptedException: Wrong format: ac”错误。 以下是将对象写入文件的代码。
public void writeToBinary (String filename, Object obj, boolean append){
file = new File ("mySchedule");
try{
if (!append) { out = new ObjectOutputStream (getContext().openFileOutput(filename,Context.MODE_PRIVATE)); }
else { out = new AppendableObjectOutputStream (getContext().openFileOutput(filename, Context.MODE_APPEND)); }
// Toast.makeText(getActivity().getApplicationContext(), "Starting to add to File", Toast.LENGTH_SHORT).show();
out.writeObject(obj);
out.flush();
Toast.makeText(getActivity().getApplicationContext(), "Added to File", Toast.LENGTH_SHORT).show();
}catch (Exception e){
e.printStackTrace ();
// Toast.makeText(getActivity().getApplicationContext(), "Exception to File", Toast.LENGTH_SHORT).show();
}finally{
try{
if (out != null) out.close ();
// Toast.makeText(getActivity().getApplicationContext(), "Close to File", Toast.LENGTH_SHORT).show();
}catch (Exception e){
e.printStackTrace ();
}
}
}
private static class AppendableObjectOutputStream extends ObjectOutputStream {
public AppendableObjectOutputStream(OutputStream out) throws IOException {
super(out);
}
@Override
protected void writeStreamHeader() throws IOException {}
}
我正在使用下面的代码行调用该方法,每次用户单击按钮并将对象写入文件。方法将被调用,并且对象将被保存与用户单击按钮一样多次。
if(MainActivity.firstTime) {
writeToBinary("mySchedule", scheduleBeans, false);
MainActivity.firstTime=false;
} else {
writeToBinary("mySchedule", scheduleBeans, true);
}
这里,scheduleBeans 是实现可序列化的类的对象。 MainActivity.firstTime 是在活动中定义的公共静态布尔变量,用作标志。
现在我正在使用以下代码读取文件。
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(getContext().openFileInput("mySchedule"));
Toast.makeText(getActivity().getApplicationContext(), "File Opened", Toast.LENGTH_SHORT).show();
while (true) {
arrayList.add((ScheduleBeans) ois.readObject());
Toast.makeText(getActivity().getApplicationContext(), "Read from File", Toast.LENGTH_SHORT).show();
}
} catch (EOFException e) {
Toast.makeText(getActivity().getApplicationContext(), "Exception End of File", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getActivity().getApplicationContext(), "Exception to Opening File", Toast.LENGTH_SHORT).show();
} finally {
try {
if (ois != null) {
ois.close();
// Toast.makeText(getActivity().getApplicationContext(), "Closing file", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
// Toast.makeText(getActivity().getApplicationContext(), "Exception in Closing file", Toast.LENGTH_SHORT).show();
}
}
如果文件中有多个对象,我在从文件中读取第二个对象时收到错误“java.io.StreamCorruptedException: Wrong format: ac”。
你能告诉我应该改变什么代码才能成功读取文件中的所有对象吗?
更新——问题已解决。上面有问题的代码被编辑为解决的工作代码。
【问题讨论】:
-
很难理解为什么要从标题中删除相关信息。
-
HI EJP,我已经浏览了您所指的帖子,但找不到解决错误的解决方案。
标签: android file serialization objectinputstream objectoutputstream