【问题标题】:java.io.StreamCorruptedException: Wrong format: ac error androidjava.io.StreamCorruptedException:格式错误:ac error android
【发布时间】: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”。

你能告诉我应该改变什么代码才能成功读取文件中的所有对象吗?

更新——问题已解决。上面有问题的代码被编辑为解决的工作代码。

【问题讨论】:

标签: android file serialization objectinputstream objectoutputstream


【解决方案1】:

您在这两种情况下都使用了 MODE_APPEND,包括您不应该附加到文件的情况。

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

【讨论】:

  • 感谢 EJP,我想将对象附加到文件中。您能否指导如何在 android 中附加对象并读取所有对象?
  • 有时想要追加。您在这两种情况下都在追加。在第一种情况下,您不应该使用 MODE_APPEND。您已在未使用附加流的情况下附加到流。
  • 我很感激。我已将第一个 MODE_APPEND 更改为 MODE_PRIVATE,并且在从文件中读取第二个对象时错误更改为 EOFException。
  • 所以文件中没有第二个对象。
  • 是的,当我添加第二个对象时,它正在覆盖第一个对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多