0

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

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

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();
4

2 回答 2

0

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

  1. 写入文件时出现问题,或文件本身可能损坏。
  2. 它可以是不应该是零长度的零长度文件。
  3. 您可能正在读取文件,而不是写入的文件。

我的建议是,检查is.available()并尝试读取对象。

于 2013-04-21T14:48:32.500 回答
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()和循环中读取对象之前写入它们的计数
于 2013-04-21T22:28:09.827 回答