为is.readObject生成异常。为什么?

时间:2013-04-21 14:13:15

标签: java android

我有一个游戏定期将游戏当前状态保存到文件中(通过将序列化对象写入文件)。用户可以稍后恢复游戏,它将读取该对象并从那里构建游戏。 / p>

这似乎工作正常,但有时我得到这个例外

java.io.EOFException
        at java.io.DataInputStream.readByte(DataInputStream.java:98)
        at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:506)
        at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:778)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)
        at com.myGame.GameState.loadFromFile
        at com.myGame.GameState.loadGame

这是loadFromFile代码

         try {
    FileInputStream fis = mActivity.openFileInput(fileName);
    ObjectInputStream is = new ObjectInputStream(fis);
    stateDetails = (StateDetails)is.readObject();//exception is generated here

    is.close();
    fis.close();
} catch (Exception e) {
    MyApplication.SWERR(e);
}

我不明白为什么会发生这种情况。它的一次性保存和阅读对象。没有涉及到达文件末尾的循环。它为什么会被生成? 任何帮助表示赞赏........谢谢

编辑:这是我保存的方式

FileOutputStream fos = mActivity.openFileOutput(fileName, Context.MODE_PRIVATE);
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(stateDetails);
            os.flush();
            fos.flush();
            os.close();
            fos.close();

2 个答案:

答案 0 :(得分:0)

EOFException表示您正在尝试读取文件的末尾。可能的原因可能是:

  1. 写入文件时出现问题,或文件本身可能损坏。
  2. 它可以是零长度文件,不应该是零长度。
  3. 你可能正在阅读一个文件,而不是写的文件。
  4. 我的建议是,检查is.available()并尝试阅读该对象。

答案 1 :(得分:0)

  

这似乎工作正常,但有时我得到这个例外

尝试使用这种方法:

try {
   FileInputStream fis = mActivity.openFileInput(fileName);
   ObjectInputStream is = new ObjectInputStream(fis);
   while(true) {
      try {
         stateDetails = (StateDetails) is.readObject();
      }
      catch(EOFException ex) {
          is.close();
          break;     
      }
   }
}
catch (Exception e) {
   MyApplication.SWERR(e);
}

我有类似的问题,我通过上面的代码解决了它。但总是需要确保:

  • 不要拨打readObject()两次
  • 写完后立即关闭ObjectOutputStream
  • 如果您首先要编写更多对象,则需要编写它们 通过writeInt(<value>)计算,然后在阅读getInt()之前读取对象 在循环中