我正在制作一个只打字游戏(没有图形),我需要保存游戏状态并稍后重新加载。我一直在想但却什么也想不到(我不是一个非常有经验的程序员)。有人可以启发我吗?
答案 0 :(得分:3)
您需要您的班级来实施Serializable
界面。然后将对象写入文件。然后在启动时再次读回文件。
序列化对象意味着将其状态转换为字节流 字节流可以恢复为对象的副本。一个 Java对象是可序列化的,如果它的类或它的任何超类 实现java.io.Serializable接口或其 子接口,java.io.Externalizable。反序列化是一个过程 将一个对象的序列化形式转换回一个副本 宾语。
Serialzable
界面的美妙之处在于您不需要实现任何方法。它是一个标记界面。您只需创建一个类Serializable
,然后将其写入文件。
此处谨慎提示:每次写入文件时都需要截断文件。不要尝试将数据附加到它。它会破坏文件的标题。
这里的教程:http://docs.oracle.com/javase/tutorial/jndi/objects/serial.html
答案 1 :(得分:1)
您可以使用ObjectOutputStream
并调用其方法writeObject
来保存您的游戏状态。
并使用ObjectInputStream
并调用其方法readObject
来加载游戏状态。
e.g。
保存游戏状态
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();
... ...
}
答案 2 :(得分:0)
用于持久化对象状态