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,包括您不应该附加到文件的情况。

您应该只在其他情况下使用它。