1

私は原始的な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 では「=」は右側のオブジェクトがコピーされることを意味しないため、もう 1 つの問題は、メソッド「Load」が終了すると、「cpu」(「Game の変数」 "-class) には、ファイルからロードした CPU がまだ含まれていますが、そこからデータを読み取ることができますか?

4

2 に答える 2

1

実際には、SaveGame()メソッドに渡す元のファイル名にが含まれている場合にのみ機能します".dat"

実際、readingメソッドはその条件をチェックし、SaveGame()メソッド(saveGame()Javaの命名規則を尊重するように名前を付ける必要があります)は、ファイル名に.datを追加しません。実際、文字列は不変であり、concat()メソッドは新しい文字列を返しますが、呼び出された文字列を変更しません。コードは次のようになります

String sav = s.concat(".dat");

また、実行しているように例外を無視するのをやめ、finallyブロックでストリームを常に閉じる必要があります。Java 7を使用している場合は、try-with-resourcesコンストラクトを使用してください。

于 2012-11-27T21:20:35.893 に答える