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);
}

なぜこれが起こるのかわかりません。その 1 回限りのオブジェクトの保存と読み取り。ファイルの終わりに到達するためのループはありません。なぜ生成されるのでしょうか?どんな助けでも大歓迎です.......ありがとう

編集:これが私が保存する方法です

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

これは正常に動作しているようですが、時々この例外が発生します

このアプローチを使用してみてください:

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 に答える
0

EOFExceptionは、ファイルの末尾を超えて読み取ろうとしていることを意味します。考えられる原因は次のとおりです。

  1. ファイルの書き込み中に問題が発生したか、ファイル自体が破損している可能性があります。
  2. 長さゼロであってはならない長さゼロのファイルである可能性があります。
  3. 書き込まれたもの以外のファイルを読み取っている可能性があります。

私の提案は、is.available()にチェックを入れて、オブジェクトを読み取ってみることです。

于 2013-04-21T14:48:32.500 に答える