IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

CorruptedStreamException! j'ai tout essayé sans succès.


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Ingenieur Opérations
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingenieur Opérations

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut CorruptedStreamException! j'ai tout essayé sans succès.
    Bonjour à tous et merci de me venir en aide.
    Voila: je suis débutant en programmation java et je développe un petit calpin électronique. J'ai donc créer une class "Contact" qui doit contenir toutes les données sur un contact .Je l'ai faite hérité de "Serializable" pour pouvoir sauver sur disque les differents objets de la classe par l'intermédiaire de ObjectOutputStream, et restaurer ave ObjectInputStream .Mais justement le problème c'est que je n'arrive pas à les restaurer au lancement de l'application .En fait dans une boucle ou je décide après avoir ouvert le flux de lire le contenu et d'afficher le champs "nom" 1 par 1 des differents objets dans une jList , l'exception "CorruptedStreamException" est levé à la lecture du 2nd enregistrement .Pourtant je ne modifie absolument pas le fichier entre la sauvegarde et la tentative de restauration. Qu'est-ce qui peut etre à l'origine de cette erreur. Ca fait 2 jours déjà que j'essaye de trouver solution au problème.
    ps:Je joins ci-dessous le code de la boucle de restauration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                           FileInputStream fis = new FileInputStream(fichierContacts);
                           ObjectInputStream ois = new ObjectInputStream(fis);
                            Contact ctc = (Contact)ois.readObject();
                            while(ctc != null) {
                               items.addElement(ctc.getName());
                               ctc = (Contact)ois.readObject();
                               }
                              ois.close();

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut


    On peut voir aussi le code utiliser pour l'écriture et savoir à quelle ligne se déclenche l'exception? (Première lectur ou dans la boucle? si oui, au bout de combien de boucles). Donne aussi le stacktrace de ton exception.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Ingenieur Opérations
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingenieur Opérations

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour tchize
    En fait pour l'écriture je fait appel à la fonction suivante lors du click sur un bouton "sauver contact"(donc l'appel de la méthode de l'évenement ActionPerformed du bouton) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    static public void sauverContactDansFichier(String fichier,Contact ctc) {
            try {
                 FileOutputStream f = new FileOutputStream(fichier,true);
                 ObjectOutputStream ff = new ObjectOutputStream(f);
     
                ff.writeObject(ctc);
                ff.close();
                }
           catch(java.io.IOException e) {
               e.printStackTrace();                      
           } 
        }
    et le code de la méthode ActionPerformed en question est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            // TODO add your handling code here:
            String nom = jTextField1.getText();
            int num = Integer.parseInt(jTextField2.getText()) ;
            String type = (String)jComboBox2.getSelectedItem();
            String email = jTextField3.getText();
            String groupe =(String) jComboBox1.getSelectedItem();
     
            Contact ctc = new Contact(nom,type,email,groupe,num );
     
            //je recupère le champ nom du contact que je met dans une jList
            items.addElement(ctc.getName());   
            Fonctions.sauverContactDansListe(listeContacts, ctc);
            //je sauve ensuite le contact dans le fichier binaire.
            Fonctions.sauverContactDansFichier(fichierContacts, ctc);
     
     
        }
    Pour la question qui est de savoir "au bout de combien de lecture il y a interruption, c'est au bout de la 2nd lecture.Voici le message renvoyé par printStackTrace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    java.io.StreamCorruptedException: invalid type code: AC
            at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1373)
            at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
            at agenda.acceuil.AgendaElectroniqueGUI.initialise(AgendaElectroniqueGUI.java:478)
            at agenda.acceuil.AgendaElectroniqueGUI.<init>(AgendaElectroniqueGUI.java:23)
            at agenda.acceuil.AgendaElectroniqueGUI$6.run(AgendaElectroniqueGUI.java:457)
            at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:602)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
    L'exception se déclare donc à la deuxième lecture avec ois.readObject().
    Voila j'espère bien avoir donné le maximum de détail.Et aussi merci d'avance ,car je commençais à désespérer que personne ne s'occupe de mon cas.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Je vois que tu fait une seul écriture dans le fichier (un seul objet écrit entre le open et le close de l'objectOutputStream) alors que tu tente de faire plusieurs lecture. C'est déjà une problème, tu ne peux pas lire ce que tu n'as pas écrit

    Ensuite, je vois que tu travaille en "append" dans le fichier. C'est bien joli çà, mais c'est pas comme çà qu'on fait. On crée l'objetOutputStream, on écrit tout ce qui doit etre écrit et on ferme. Sinon ce qui se trouve dans le fichier est joyeusement mélangé avec des entêtes ajoutées par les new objetoutputstream(....). Donc la règle c'est, un fichier = un objetoutputstream.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Ingenieur Opérations
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingenieur Opérations

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonsoir tchize.
    En fait je ne fait pas une seule écriture, mais plusieurs(je sais bien que je ne peux pas lire ce que je n'ai pas écrit) .Ensuite si j'écris en append c'est parce que je veux sauver plusieurs objets dans un seul fichier( je me rappelle que je le faisait très bien en C ) .Sinon d'après ce que tu m'expliques, que lors de l'écriture d'un nouvel objet ,il y a ajout d'entêtes par ObjectOutputStream, je commence à comprendre d'où pourrait venir le problème. Si je dois suivre ta règle, est-ce que cela suppose que pour chaque contact que je veux créer ,je dois avoir un fichier distinct à créer pour en assurer la sauvegarde?Et dans ce dernier cas ,comment générer des noms pour chaque fichier ,puisqu'avec un fichier c'est facile,on a un seul nom à gérer.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    non, tu n'as pas une entete pour chaque objet. Tu a une entete à chaque fois que tu crée un ObjectOutputStream.

    Pour écrire plusieurs objet, c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ObjectOutputStream os = ........;
    os.writeObject(objet1);
    os.writeObject(objet2);
    ....
    os.close();
    Ton problème viens du fait que tu fais plusieurs ObjetcOutputStream sur le même fichier alors que tu n'utilise qu'un seul ObjetInputStream. Tu dois faire ta lecture strictement dans le même ordre que tu a fait ton écriture. Théoriquement, à chaque fois que tu a utilisé un ObjectOutputStream, tu dois, au même offset du fichier, pour la lecture, faire un ObjectInputStream.

Discussions similaires

  1. Sasser j'ai tout essayé
    Par bohor2gannes dans le forum Sécurité
    Réponses: 5
    Dernier message: 22/10/2007, 23h17
  2. lecture et ecriture sur un meme /dev/pty sans succes
    Par pcouas dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 13/04/2007, 19h25
  3. alternatives aux curseurs sans succès
    Par maxtin dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 21/09/2006, 15h15
  4. Réponses: 6
    Dernier message: 16/08/2006, 16h56
  5. Outlook express: tout recup sans export
    Par Harry dans le forum Outlook Express / Windows Mail
    Réponses: 3
    Dernier message: 22/04/2006, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo