我正在制作一个只打字的游戏(没有图形),我需要在其中保存游戏状态并稍后重新加载。我一直在想,但什么也想不到(我不是一个很有经验的程序员)。有人可以启发我吗?
问问题
10288 次
3 回答
3
你需要你的类来实现Serializable
接口。然后将对象写入文件。然后在启动时再次读回文件。
序列化对象意味着将其状态转换为字节流,以便字节流可以恢复为对象的副本。如果 Java 对象的类或其任何超类实现了 java.io.Serializable 接口或其子接口 java.io.Externalizable,则它是可序列化的。反序列化是将对象的序列化形式转换回对象副本的过程。
接口的美妙之Serialzable
处在于您不需要实现任何方法。它是一个标记界面。您只需创建一个类Serializable
,然后将其写入文件。
这里要注意的是:每次写入文件时都需要截断文件。不要尝试向其附加数据。它破坏了文件的标题。
教程在这里:http ://docs.oracle.com/javase/tutorial/jndi/objects/serial.html
于 2013-11-05T08:34:13.207 回答
2
你可以使用ObjectOutputStream
并调用它的方法writeObject
来保存你的游戏状态。
并使用ObjectInputStream
并调用其方法readObject
来加载游戏状态。
例如
保存游戏状态
public void saveGameDataToFile(File file) {
try {
FileOutputStream fileStream = new FileOutputStream(file);
ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);
objectStream.writeObject(flag);
objectStream.writeObject(color);
objectStream.writeObject(snake);
objectStream.writeObject(food);
objectStream.writeObject(new Integer(score));
objectStream.writeObject(barrier);
objectStream.writeObject(new Boolean(needToGenerateFood));
objectStream.writeObject(new Boolean(needToGenerateBarrie));
objectStream.close();
fileStream.close();
JOptionPane.showConfirmDialog(frame,
"Save game state successfully.",
"Snake Game",
JOptionPane.DEFAULT_OPTION);
} catch (Exception e) {
JOptionPane.showConfirmDialog(frame,
e.toString() + "\nFail to save game state.",
"Snake Game",
JOptionPane.DEFAULT_OPTION);
}
}
加载游戏状态
public void loadGameDataFromFile(File file) throws ClassNotFoundException{
... ...
FileInputStream fileStream = new FileInputStream(file);
ObjectInputStream objectStream = new ObjectInputStream(fileStream);
svaedFlag = (int[][]) objectStream.readObject();
savedColor = (Color[][]) objectStream.readObject();
savedSnake = (Snake) objectStream.readObject();
savedFood = (Grid) objectStream.readObject();
savedScore = (Integer) objectStream.readObject();
savedBarriers =(Barriers) objectStream.readObject();
savedNeedToGenerateFood = (Boolean)objectStream.readObject();
savedNeedToGenerateBarrie = (Boolean)objectStream.readObject();
... ...
}
于 2013-11-05T08:42:12.153 回答
0
为了保持对象状态,您可以
- 使用序列化
- 将内容保存为文本或 xml
- 将内容保存到数据库(sqlLite,hsql)
于 2013-11-05T08:34:40.917 回答