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 :

Exception IO lors de l'écriture de données


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut Exception IO lors de l'écriture de données
    Bonjour,

    une IOException est lancée lorsque j'exécute une écriture de données dans un fichier. Voici le code en gros:
    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
    20
    21
    22
    23
    24
    try
    {
      fichierSource = new File( sDossier + File.separator + sFichier );
     
      // Ouverture d'un flux de sortie vers le fichier indiqué:
      FileOutputStream fOutStream = new FileOutputStream( fichierSource );
     
      // Création d'un flux "Objet" vers le flux de sortie:
      ObjectOutputStream oOutStream = new ObjectOutputStream( fOutStream );
     
      try
      {
        oOutStream.writeObject( listeAdherents ); // C'EST D'ICI QU'EST LANCEE L'EXCEPTION
        /.../
      }
      catch ( IOException )
      {
        // C'EST ICI QUE SE RETROUVE LE PROGRAMME SUITE A LA PREMIERE INSTRUCTION D'ECRITURE
      }
    }
    catch (  IOException iOE  )
    {
      /.../
    }
    Pour info, voici la déclaration de l'objet listeAdherents:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class CListeAdherent extends AbstractTableModel implements Serializable
    {
      /.../
    }
    Ce qui est étonnant, c'est le message de l'exception:
    java.awt.image.BufferedImage ??!

    Je ne vois pas le rapport, car je ne fais pas de traitement d'image dans la classe où a lieu l'écriture des données, ainsi que dans la classe que je tente de sauvegarder

    Quelqu'un a-t-il une explication ?
    Merci & @ bientôt...

  2. #2
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    si on avait le message de l'exception, ce serait plus facile

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rtg57 Voir le message
    Ce qui est étonnant, c'est le message de l'exception:
    java.awt.image.BufferedImage ??!
    Le message de l'exception ne concerne qu'une minuscule partie de l'information contenu dans une exception. De plus le message en lui même est souvent inutile tout seul. Il faut toujours s'intéresser au stacktrace complet ainsi qu'au type exact de l'exception.

    Ici je parierais sur une NotSerializableException (et le message prendrait alors tout son sens).

    a++

  4. #4
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Bingo !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println( iOE.toString());
    me donne l'information suivante:
    java.io.NotSerializableException: java.awt.image.BufferedImage
    Cependant, je ne vois pas le rapport entre cette exception et java.awt.image.BufferedImage
    .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println( iOE.getStackTrace());
    me donne une adresse hexadécimale, probablement de l'objet en défaut. Mais je ne sais pas s'il existe un outil me permettant de faire le lien entre cette adresse et les objets de mon application. (Programmation sous ECLIPSE Helios)

    @ bientôt...

  5. #5
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour afficher le stacktrace, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exception.printStacktrace();
    et le java.awt.image.BufferedImage mentionne justement que cette classe n'est pas sérialisable, hors elle a été rencontrée durant le processu, d'ou problème.

  6. #6
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Bonjour,

    merci pour votre soutien... lorsque que je demande exception.printStackTrace(), j'en ai pour 3 pages dans la console de l'EDI, dont voici le début:
    java.io.NotSerializableException: java.awt.image.BufferedImage
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeArray(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.access$300(Unknown Source)
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(Unknown Source)
    at java.io.ObjectOutputStream.writeFields(Unknown Source)
    at java.awt.Container.writeObject(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)
    La seule chose que je capte là-dedans, c'est qu'il n'arrive pas sérialiser la BufferedImage.

    J'ai peut être une piste:
    l'objet listeAdherents que j'essaie de sérialiser est une classe contenant des ArrayList quelques int et byte, ainsi qu'une référence vers une autre classe.
    De plus, listeAdherents utilise une classe qui emploie BufferedImage...
    Est-ce que lors de la sérialisation, tout ce que contient listeAdherents est sérialisé ?

    Dans ce cas je m'y prends mal car ce que je voudrais, c'est de sauvegarder les ArrayList, int et byte...mais alors comment faire pour indiquer à la sérialisation que seuls ces éléments m'intéressent ?

    @ bientôt...

  7. #7
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Soit tu implémente plutot Externalizable comme interface. Celle-ci te donne le controle sur le processus de serialisation et tu peux ainsi, toi même, ecrire les différents éléments constitutif de ton objet que tu veux sauver et, aussi, toi même recréer ton objet. C'est la méthode "propre" si tu a beaucoup de champs que tu ne veux pas sauver

    Soit tu met le mot clé transient (attention, pas le @Transient de JPA!) devant les champs qu'il ne faut pas sérialiser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private transient BufferedImage laPhoto;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/04/2010, 17h14
  2. exception lors de l'écriture dans un fichier
    Par nicolassar dans le forum Visual C++
    Réponses: 5
    Dernier message: 03/11/2009, 01h31
  3. Exception lors de l'insertion de données/PDA
    Par soetja dans le forum Windows Mobile
    Réponses: 3
    Dernier message: 23/05/2008, 04h44
  4. Réponses: 2
    Dernier message: 29/05/2006, 09h54
  5. Passer à la ligne lors de l'écriture dans un fichier
    Par hams dans le forum Assembleur
    Réponses: 4
    Dernier message: 17/04/2005, 19h25

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