java.io.StreamCorruptedException: 格式错误:ac 错误 android
java.io.StreamCorruptedException: Wrong format: ac error android
我正在将序列化对象写入文件并在 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 {}
}
我正在使用下面的代码行调用该方法,每次用户单击按钮并将对象写入 file.Method 时都会被调用,并且对象将在用户单击按钮时保存多次。
if(MainActivity.firstTime) {
writeToBinary("mySchedule", scheduleBeans, false);
MainActivity.firstTime=false;
} else {
writeToBinary("mySchedule", scheduleBeans, true);
}
这里,scheduleBeans是class的实现serializable的对象。 MainActivity.firstTime 是在 activity 中定义的 public 静态布尔变量,用作标志。
现在我正在使用下面的代码读取文件。
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"。
能否请您告诉我应该更改代码以成功读取文件中的所有对象?
更新——问题已解决。以上有问题的代码被编辑为已解决的工作代码。
您在这两种情况下都使用了 MODE_APPEND,包括您不应该附加到文件的情况。
您应该只在其他情况下使用它。
我正在将序列化对象写入文件并在 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 {}
}
我正在使用下面的代码行调用该方法,每次用户单击按钮并将对象写入 file.Method 时都会被调用,并且对象将在用户单击按钮时保存多次。
if(MainActivity.firstTime) {
writeToBinary("mySchedule", scheduleBeans, false);
MainActivity.firstTime=false;
} else {
writeToBinary("mySchedule", scheduleBeans, true);
}
这里,scheduleBeans是class的实现serializable的对象。 MainActivity.firstTime 是在 activity 中定义的 public 静态布尔变量,用作标志。
现在我正在使用下面的代码读取文件。
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"。
能否请您告诉我应该更改代码以成功读取文件中的所有对象?
更新——问题已解决。以上有问题的代码被编辑为已解决的工作代码。
您在这两种情况下都使用了 MODE_APPEND,包括您不应该附加到文件的情况。
您应该只在其他情况下使用它。