WriteObject readObject

jguillemette Messages postés 31 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 1 octobre 2010 - 2 févr. 2005 à 11:06
jguillemette Messages postés 31 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 1 octobre 2010 - 2 févr. 2005 à 19:43
bonjour,

j'ai un Vector contenant uniquement des String
je souhaite enregistrer ces String dans un fichier pour ensuite les relire.
Problème: je ne peux relire que la 1ere série de String enregistées
exemple: j'écris "toto", "tutu"
je ferme l'application
je redémarre (je peux lire sans problème "toto" "tutu"), j'écris "titi"
si je relis mes String j'obtiens "toto" "tutu" puis l'erreur (lors du readObject():

java.io.StreamCorruptedException


at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1301)


at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)


at gestionmas.stratus.AffiTrace6500.lectureSur6500(AffiTrace6500.java:147)


at gestionmas.stratus.AffiTrace6500.(AffiTrace6500.java:26)


at gestionmas.menu.JGMenu.actionPerformed(JGMenu.java:139)


at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)


at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)


at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)


at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)


at javax.swing.AbstractButton.doClick(AbstractButton.java:289)


at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1113)


at javax.swing.plaf.basic.BasicMenuItemUI$MouseInputHandler.mouseReleased(BasicMenuItemUI.java:943)


at java.awt.Component.processMouseEvent(Component.java:5100)


at java.awt.Component.processEvent(Component.java:4897)


at java.awt.Container.processEvent(Container.java:1569)


at java.awt.Component.dispatchEventImpl(Component.java:3615)


at java.awt.Container.dispatchEventImpl(Container.java:1627)


at java.awt.Component.dispatchEvent(Component.java:3477)


at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)


at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)


at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)


at java.awt.Container.dispatchEventImpl(Container.java:1613)


at java.awt.Window.dispatchEventImpl(Window.java:1606)


at java.awt.Component.dispatchEvent(Component.java:3477)


at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)


at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)


at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)


at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)


at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)


at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

voici mon code (simplifié):

public void sauvegarde(Vector v) {
try{
FileOutputStream fos = new FileOutputStream("file.ser", true);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Enumeration en = w.elements();
while(en.hasMoreElements())
{
oos.writeObject(en.nextElement());
oos.flush();
}
oos.close();
fos.flush();
fos.close();
} catch(Exception e) { System.out.println("ERREUR StratusEchangesFtp.sauvegardeSur6500()"); e.printStackTrace();}
}



public Vector lecture() {
try {
FileInputStream fis = new FileInputStream("file.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
} catch(...) {...}


Vector traces = new Vector();
while(true) {
try { traces.addElement(ois.readObject()); }
catch(EOFException eofex) { ... break; }
catch(ClassNotFoundException cnfex) { ... break; }
catch(IOException ioex) { ... break; }
catch(Exception e) { ... break; }
}
try {
ois.close();
fis.close();
} catch(...) {...}
return((Vector)traces.clone());
}
}

merci de votre aide
jerome

3 réponses

nizaration Messages postés 5 Date d'inscription dimanche 15 juin 2003 Statut Membre Dernière intervention 22 novembre 2005
2 févr. 2005 à 14:17
saaalut;

tu peut enregistrer le vecteur entier puis tu le recupère avec un casting .

> ecriture : oos.writeObject(v);

> lecture : Vector v=(Vector)
oos
.readObject();

c plus facile à manipuler !!!
0
jguillemette Messages postés 31 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 1 octobre 2010
2 févr. 2005 à 14:37
j'ai peur d'avoir mal compris le role du writeObject: cette methode est-elle censée ajouter un nouvel "Object" à la FIN des "Object" déjà présent dans le fichier ouvert par le FileOutputStream via un ObjectOutputStream?

jerome
0
jguillemette Messages postés 31 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 1 octobre 2010
2 févr. 2005 à 19:43
visiblement, malgré le paramêtre append à 'true' dans le FileOutputStream, le writeObject ne se fait pas correctement à la fin du fichier (enfin c'est ce que j'en déduis), car pour m'en sortir, je relis maintenant d'abord toutes les String depuis le fichier et je les stocke dans un Vector (appel de la fonction lecture() ) puis j'ajoute à ce Vector les nouvelles String, enfin je sauvegarde le Vector final (qui contient donc les anciennes et les nouvelles String) avec un paramêtre append à false pour le FileOutputStream ce qui écrase tout ce qu'il y avait au paravant dans le fichier.
Cette solution est possible car je n'ai pas un nombre énorme de String par fichier (quelques centaines au maximum). Maintenant ça marche, mais je n'ai toujours pas compris pourquoi l'ancienne version ne fonctionnait pas et ça me désole, donc si quelqu'un peut éclairer ma lanterne...

jerome
0
Rejoignez-nous