我正在研究一个原始的RPG,这个类(据说)包含所有必要的数据:
public class CPU implements Serializable{
private Map<String, Location> locations;
private Map<String, Location> places;
private Map<String, NPC> npcs;
private Game game;
private Player player;
private NPC currentNPC;
public CPU(){
}
(我没有包括这些方法,但我认为这些方法现在无关紧要了......)
类“Game”还包含Player和CPU作为变量,但它的构造函数不是实际创建它们的(它们是在main()方法中创建的,然后添加到类中)。这个方法应该将CPU类保存到文件中,以便我可以在以后读取它的所有数据:
public void SaveGame(String s){
String sav = s;
sav.concat(".dat");
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(sav));
oos.writeObject(cpu);
oos.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
这是从文件中加载它的方法:
public void Load(String s){
if(s.contains(".dat")){
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(s));
cpu = (CPU)ois.readObject();
ois.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
我的问题基本上是:这会有效吗?我能简单地序列化CPU类并将其保存到文件中,然后将其读回并能够从中恢复所有数据(即播放器数据)吗?
如果我没记错的话,在Java中“=”并不意味着右侧的对象会被复制,所以我的另一个问题是:当“Load”方法完成时,将是“cpu”(变量为“Game”-class)仍然包含我从文件加载的CPU,我能从中读取数据吗?
答案 0 :(得分:1)
实际上,只有传递给SaveGame()
方法的原始文件名包含".dat"
时,它才有效。
实际上,read方法会检查该条件,并且SaveGame()
方法(应该命名为saveGame()
以遵守Java命名约定)不会将.dat附加到文件名中。实际上,字符串是不可变的,concat()
方法返回一个新的String,但不会修改它所调用的String。代码应该是
String sav = s.concat(".dat");
您还应该停止忽略您正在执行的异常,并且应始终关闭finally块中的流。如果您使用的是Java 7,请使用try-with-resources构造。
答案 1 :(得分:0)
如果您的程序具有写入文件的权限,并且所有字段类(NPC,游戏,播放器。位置)也可以序列化,那么它将起作用。
Game类的cpu
字段将包含从文件加载的CPU,如果在读取对象时没有抛出异常。