Serialiser un objet sans vider le fichier existant ?
bbrizn
Messages postés14Date d'inscriptionmercredi 16 décembre 2009StatutMembreDernière intervention26 janvier 2010
-
10 janv. 2010 à 11:18
cormandyr
Messages postés600Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention 8 juillet 2016
-
27 janv. 2010 à 09:28
bonjour à tous,
j'ai un peu progressé sur mon problème de sérialisation d'une arraylist, maintenant je crée bien un fichier .dat contenant mes infos mais quand je relance mon programme, il repart systématiquement d'un .dat vierge.
Je suis sûr que c'est tout bête j'ai même essayé d'enlever le 'flush' croyant que c'était lui mais rien n'y fait et dans google je ne trouve pas les bons termes pour poster une question qui renvoie une réponse.
merci d'avance donc à quiconque me mettre sur la bonne voie.
bon dimanche.
Didier.
cormandyr
Messages postés600Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention 8 juillet 201611 25 janv. 2010 à 14:03
Salutation bbrizn,
Lorsque tu crées ton FileOutputStream, lors de l'appel du constructeur, tu peux ajouter comme paramètre un boolean qui signalera si ton fichier est ouvert en mode APPEND ou non... Ce qui veux dire s'il l'on écrase le fichier ou si on écrit à la fin de ce dernier...
par defaut il est a FALSE, donc on écrase le fichier.
bbrizn
Messages postés14Date d'inscriptionmercredi 16 décembre 2009StatutMembreDernière intervention26 janvier 2010 26 janv. 2010 à 22:33
Bonsoir Cormandyr,
j'ai lu attentivement tes deux réponses, j'ai passé plusieurs petits tests mais je ne parviens toujours pas à mon résultat, je pense que je gère mal mon fichier même en ajoutant 'true' lors de l'ouverture de celui ci.
mon nouveau code tiens compte des différentes réponses que j'ai reçu, mais il ne marche toujours pas.
je continue ma quète !
voici mon code modernisé:
/**
* Classe interne qui lance l'enregistrement et la mise à zero des jtext lorsque l'on clique sur le bouton sauvegarde
*/
class BoutonListener implements ActionListener { // SAUVEGARDE
public void actionPerformed(ActionEvent e) {
System.out.println("==> on entre dans le bouton sauvegarde");
System.out.println("==> le nom saisi est égale à " + tonNom.getText());
System.out.println("==> le prénom saisi est égale à " + tonPrenom.getText());
//CREATION AUTRE LISTE
al.add(tonNom.getText());
al.add(tonPrenom.getText());
for(int i = 0; i < al.size(); i++)
{
System.out.println("vous avez rentré dans votre liste " + i + " = " + al.get(i));
}
// parcours de la liste :
// récupération de la taille de la liste
int listeTaille = al.size();
System.out.println("taille actuelle de la liste : " + listeTaille);
for (int i = 0; i < listeTaille; i++) {
al.get(i);
// test visible qui fonctionne, on vide le formulaire
tonNom.setText("");
tonPrenom.setText("");
System.out.println("===> vérification du Vidage des Jtextfield nom et prénom : " + tonNom.getText() + " <=="+ tonPrenom.getText());
/*
* BLOC DE SERIALISATION
*/
// déclaration pour sérialisation.
ObjectOutputStream oos;
//AddActionCopySerialisable maSerialization = new AddActionCopySerialisable();
try {
oos = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File("nomPrenom.dat"),true)));
// oos = new ObjectOutputStream(new BufferedOutputStream (new FileOutputStream(new File("nomPrenom.dat"))));
//Nous allons écrire chaque objet al de l'arraylist dans le fichier
Object o = al;
oos.writeObject(o);
System.out.println(" ===> oos vient d'être renseigné dans le flux" + o);
//NE PAS OUBLIER DE FERMER LE FLUX ! ! !
oos.flush();
oos.close();
cormandyr
Messages postés600Date d'inscriptionsamedi 20 mai 2006StatutMembreDernière intervention 8 juillet 201611 27 janv. 2010 à 09:28
Salut,
apres avoir tester, je pense avoir compris al source du problème.
Lors d'une seule exécution, il garde bien toutes les données. La preuve, le fichier est complet... il contient toutes LES ArrayList crées et sauvegardées... (ouvre le fichier .dat avec Notepad ++ par exemple)
Cependant, lors d'exécutions successives, les nom prénom précédament écris semblent avoir étés oubliés. Normal, tu ne relis pas ton fichier pour remplir ton ArrayList et donc il ne peux aller récupérer les anciennes valeur...
donc je te conseillerai plutot que d'ouvrir le fichier en mode append, d'initialiser ton ArrayList avec le contenu du fichier et d'écraser le fichier à chaque modification...