jguillemette
Messages postés31Date d'inscriptionjeudi 27 mars 2003StatutMembreDernière intervention 1 octobre 2010
-
2 févr. 2005 à 11:06
jguillemette
Messages postés31Date d'inscriptionjeudi 27 mars 2003StatutMembreDerniè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(...) {...}
jguillemette
Messages postés31Date d'inscriptionjeudi 27 mars 2003StatutMembreDerniè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?
jguillemette
Messages postés31Date d'inscriptionjeudi 27 mars 2003StatutMembreDerniè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...