Serialiser un objet sans vider le fichier existant ?

bbrizn Messages postés 14 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 26 janvier 2010 - 10 janv. 2010 à 11:18
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Derniè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.

3 réponses

cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
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.
0
bbrizn Messages postés 14 Date d'inscription mercredi 16 décembre 2009 Statut Membre Dernière intervention 26 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é:



package mon.test.perso.copy;

/*
* Les imports
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


/**
* Blanchard Didier
* Class ....
* description ....
*
*/
public class SerialiseOuPas extends JFrame implements Serializable {

/**
* attributs
*/
private static final long serialVersionUID = 1424L;
private JPanel container = new JPanel();
private JFormattedTextField tonNom = new JFormattedTextField();
private JLabel label = new JLabel("saisir votre nom");
private JLabel label3 = new JLabel("votre Prénom");
private JTextField tonPrenom = new JTextField();

private JButton c = new JButton ("Sauvegarde");
private JButton d = new JButton ("lecture");


//ma liste pour la sérialisation
ArrayList<String> al = new ArrayList<String>();

/*
* Other méthods ....
*/


public SerialiseOuPas(){

this.setTitle("test sérialistation");
this.setSize(500, 180);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);

container.setBackground(Color.white);
container.setLayout(new BorderLayout());

/**
* définition des formats de saisie
*/


JPanel top = new JPanel();

Font police = new Font("Arial", Font.BOLD, 14);
tonNom.setFont(police);
tonNom.setPreferredSize(new Dimension(100, 30));
tonNom.setForeground(Color.BLUE);


tonPrenom.setFont(police);
tonPrenom.setPreferredSize(new Dimension(100, 30));
tonPrenom.setForeground(Color.BLUE);


c.addActionListener(new BoutonListener());
d.addActionListener(new BoutonListener2());

top.add(label);
top.add(tonNom);
top.add(label3);
top.add(tonPrenom);
top.add(c);
top.add(d);
this.setContentPane(top);
this.setVisible(true);
}


/**
* 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();


// FIN DE SERIALISATION

} catch(IOException ioe) {
ioe.printStackTrace();
}
}


}}
/**
* Classe interne qui lance la lecture
*/

class BoutonListener2 implements ActionListener { // LECTURE
public void actionPerformed(ActionEvent e) {

Object o = al;

try {
// ouverture d'un flux d'entrée depuis le fichier "nomPrenom.dat"
FileInputStream fis = new FileInputStream("nomPrenom.dat");
// création d'un "flux objet" avec le flux fichier
ObjectInputStream ois= new ObjectInputStream(fis);
try {
// désérialisation : lecture de l'objet depuis le flux d'entrée
o = ois.readObject();
} finally {
// on ferme les flux
try {
ois.close();
} finally {
fis.close();
}
}
} catch(IOException ioe) {
ioe.printStackTrace();
} catch(ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
if(o != null) {
System.out.println(o + " a ete deserialise");
}


}

public JComponent getJFrame() {

return null;
}

}



}
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
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...
0
Rejoignez-nous