écriture et lecture dans un fichier text

Résolu/Fermé
Signaler
-
 greg -
Bonjour,



dans l'objectif d'un projet j'ai créé un petit jeu en java et souhaiterais pouvoir sauvegarder et charger une partie.

étant novice j'ai suivi des tuto et voici le résultat de mes deux fonctions:


public void Save(World w, Hero h) {


ObjectOutputStream oos;

try {
oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File("saveMazeOfHorror.txt"))));
oos.writeObject(w);
oos.writeObject(h);
oos.close();
System.out.println("game saved");
} catch (java.io.IOException e) {
e.printStackTrace();
}

}

public void Load (World w, Hero h) {


ObjectInputStream ois;
try
{
ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File("saveMazeOfHorror.txt"))));
w = (World)ois.readObject();
h = (Hero)ois.readObject();
ois.close();
System.out.println("game loaded");
}
catch (java.io.IOException e) {e.printStackTrace();}
catch (ClassNotFoundException e2) {e2.printStackTrace();}

}


comme c'est écrit, je souhaite sauvegarder un objet world qui est un tableau 2d d'une classe Place dans laquelle le héro se déplacera, et bien sur un objet hero.

dans mon main je créé un world de base (début de jeu), puis propose au joueur de charger sa partie, et si oui: w.Load(w, h);

seulement voila, après cela le jeu conserve les paramètres de départ que ce soit pour le world ou mon héro.

le programme compile très bien, pas d'erreur relevée, mais je n'arrive vraiment pas a cibler le problème... quelqu'un pourrait t-il m'aider svp?




1 réponse

Messages postés
16470
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2022
2 938
new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(
Ça commence à faire beaucoup de stream d'ouvert pour ne stocker que deux objets !

new File("saveMazeOfHorror.txt")
C'est un point de détail, mais le contenu de ton fichier sera binaire, il est fortement déconseillé de lui donner une extension de fichier texte !

Bon après, il y aurait surement d'autres choses à dire, mais LA grosse erreur, est ici :

public void Load (World w, Hero h) {
...
w = (World)ois.readObject();
h = (Hero)ois.readObject();

Jamais, au grand jamais, on ne peut modifier des objets passés en paramètre en faisant une simple affectation de leurs valeurs ! Ici "w" et "h" seront bien modifiés à l'intérieur de Load, mais il n'y aura aucune conséquence au niveau de l'appel de Load, de même que pour "n" dans mon exemple suivant :

public static void incr(int n)
{
    System.out.println(n);
    n++;
    System.out.println(n);
}

public static void main(String[] args)
{
    int k = 1;
    System.out.println(k);
    incr(k);
    System.out.println(k);
}

Remarque : il y a encore plein d'autres choses qui peuvent ne pas fonctionner, en particulier parce que tes objets doivent être sérialisables, et que l'on ne sait pas si tu as fait ce qu'il fallait, mais au niveau des ObjectStream ceci serait mieux :

public void saveWorld(World w) throws IOException 
{
    ObjectOutputStream oos = new ObjectOutputStream("save.world");
    oos.writeObject(w);
    oos.close();
}

public void saveHero(Hero h) throws IOException 
{
    ObjectOutputStream oos = new ObjectOutputStream("save.hero");
    oos.writeObject(h);
    oos.close();
}

public World loadWorld() throws IOException 
{
    ObjectInputStream ois = new ObjectInputStream("save.world");
    World w = (World) ois.readObject();
    ois.close();
    return w;
}

public Hero loadHero() throws IOException 
{
    ObjectInputStream ois = new ObjectInputStream("save.hero");
    Hero h = (Hero) ois.readObject();
    ois.close();
    return h;
}
0
merci! ta solution marche très bien. j'ai adapté pour pouvoir créer les fichiers de sauvegarde et sa fonctionne. le problème venait uniquement de la. je te remercie pour ton esprit critique et ton aide, sa m'a été très utile!
0