2013-04-21 114 views
0

我有一个游戏定期将游戏当前状态保存到文件中(通过将序列化对象写入文件)。用户可以稍后恢复游戏并读取该对象并从此构建游戏。为is.readObject生成异常。为什么?

这似乎是工作的罚款,但有时我得到这个例外

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(); 
+0

你有没有添加任何字段StateDetails或任何变量被读入? – ddmps 2013-04-21 14:18:18

+0

你是什么意思添加任何字段? StatDetails是一个有15个成员变量(字段)的类 – Snake 2013-04-21 14:22:58

+1

当你写入文件时,你是否总是关闭你的流?这可能是问题的根源。 – Keppil 2013-04-21 14:25:57

回答

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()和阅读对象 前
+0

你好,谢谢你的回答。所以对于第二点来说,你的意思是说我不需要做同花顺? (马上关闭)。我不写一个以上的对象,但我所做的是每10秒后我调用上面的代码打开文件并重新写入并关闭。我不认为我需要writeInt吗? – Snake 2013-04-21 22:43:45

+0

@Snake所以你也可以调用'flush()'。不,如果你只想写一个对象,你不需要调用'writeInt()'。 – Sajmon 2013-04-21 22:45:41

+0

其实看着你上面的代码,我没有看到背后的循环点!只有一个对象被写入,它应该被读取一次 – Snake 2013-04-21 23:37:37

0

EOFException意味着你正在试图读到文件的结尾。可能的原因可能是:

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

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

+0

查看我的编辑上面的更新。为什么我会遇到上面的任何错误?调试建议? – Snake 2013-04-21 22:14:45

相关问题