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

Langage Java Discussion :

Question sur la serialisation de plusieurs Objets dans un seul fichier


Sujet :

Langage Java

  1. #1
    Membre du Club
    Homme Profil pro
    Developpeur Android
    Inscrit en
    Février 2015
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 104
    Points : 68
    Points
    68
    Par défaut Question sur la serialisation de plusieurs Objets dans un seul fichier
    Bonjour à tous,


    désolé de vous déranger un dimanche .
    Je suis en formation Java et je dois ecrire une appli qui écrit quelques Objets (d'une Classe que j'ai sérialisée) dans un seul fichier.
    Mon problème, c'est que je ne sais pas relire tout le contenu, je n'ai que le premier Objet qui s'affiche.
    J'utilise le format Binaire et non texte.

    Voici les codes :
    Ma classe Article :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import java.io.Serializable;
     
    public class Article implements Serializable {
    	String nom;
    	double prix;
    	boolean dispo;
     
    }
    J'ai créé une Classe de gestion de fichier Objet :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
    import java.io.*;
     
    public class FichierObjet {
     
    	private ObjectOutputStream ofW;
    	// Définit un Objet fW de type ObjectOutpustream Utilisé pour écrire
    	private ObjectInputStream ofR;
    	// Définit un Objet fW de type ObjectInputstream Utilisé pour lire
    	private String nomDuFichier = "stock.txt";
    	private char mode;
     
    	// De façon générale, les traitements sur fichier se déroulent en 3 temps :
    	//				1-Ouverture du flux
    	//				2-Traitement des données
    	//				3-Fermeture du flux.
     
     
    	// 1 - Ouverture Du flux.
     
     
    	public void ouvrir(String s) throws IOException {
     
    		mode = (s.toUpperCase()).charAt(0);
    		if(mode == 'R' || mode == 'L'){
    			ofR = new ObjectInputStream (new FileInputStream(nomDuFichier));
    		}
    		else if(mode == 'W' || mode == 'E'){
    			ofW = new ObjectOutputStream (new FileOutputStream(nomDuFichier));
    		}
     
    	}
     
    	// 2 - Traitement des données (du fichier).
    	// Pour l'écriture
    	public void ecrire (Article tmp) throws IOException{
    		if (tmp != null) {
    			ofW.writeObject(tmp);
    			ofW.flush();//Vide le tempon
    		}
    	}
    	// Pour la lecture
    	public Article lire() throws IOException, ClassNotFoundException {
    		Article tmp = (Article) ofR.readObject();
    		return tmp;
    	}
     
    	// 3 - Fermeture du flux.
    	public void fermer() throws IOException{
    		if(mode == 'R' || mode =='L') ofR.close();
    		else if(mode == 'W' || mode == 'E') ofW.close();
    	}
     
    }
    et enfin mon main :
    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
    25
    26
    27
    28
    29
    30
    31
     
    import java.io.IOException;
     
    public class Creer2Articles {
     
    	public static void main(String[] args) throws IOException, ClassNotFoundException {
    		Article article1 = new Article();
    		article1.nom = "table";
    		article1.prix = 1000;
    		article1.dispo = false;
     
    		Article article2 = new Article();
    		article2.nom = "canapé";
    		article2.prix = 2999.99;
    		article2.dispo = true;
     
     
    		FichierObjet articles = new FichierObjet();
    		articles.ouvrir("Ecrire");
    		articles.ecrire(article1);
    		articles.ecrire(article2);
    		articles.fermer();
     
    		articles.ouvrir("Lire");
    		Article MonArticle = articles.lire();
    		System.out.println("Article [nom="+MonArticle.nom+", prix="+MonArticle.prix+", dispo="+MonArticle.dispo+"]");
    		articles.fermer();
     
    	}
     
    }
    J'aimerai avoir ceci comme retour

    Article [nom=table, prix=1000.0, dispo=false]
    Article [nom=canapé, prix=2999.99, dispo=true]

    Mais je n'ai que ça :
    Article [nom=table, prix=1000.0, dispo=false]
    Ma question :

    Comment aller chercher tous les Articles (Objets) de mon fichier. En ouvrant mon fichier, même si c'est du binaire, je constate que les objets s'y trouvent bien.
    Ce que je ne sais pas faire c'est tous les récuperer.

    J'espère avoir été clair et je vous remercie par avance de vos retours.

    Bomatch

    @+

  2. #2
    Membre du Club
    Homme Profil pro
    Developpeur Android
    Inscrit en
    Février 2015
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 104
    Points : 68
    Points
    68
    Par défaut

    Pourquoi après une recherche d'une journée, faut il que je trouve la solution une fois le poste effectué ???

    Je vais finir par me faire taper dessus par votre équipe

    Alors, je ne sais pas si c'est la bonne pratique mais, il m'a suffit de de rappeler la lecture de mon Objet fichier pour que ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    Article MonArticle1 = articles.lire();
    		System.out.println("Article [nom="+MonArticle1.nom+", prix="+MonArticle1.prix+", dispo="+MonArticle1.dispo+"]");
    		Article MonArticle2 = articles.lire();
    		System.out.println("Article [nom="+MonArticle2.nom+", prix="+MonArticle2.prix+", dispo="+MonArticle2.dispo+"]");
    J'ai bien ceci

    Article [nom=table, prix=1000.0, dispo=false]
    Article [nom=canapé, prix=2999.99, dispo=true]
    Si vous me confirmez que la méthode est bonne. Je vais avancer dans la sérialisation d'un fichier texte(xml/Json) et non plus en binaire.

    Merci encore et désolé pour le dérangement

    Bomatch
    Bon dimanche à tous

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    C'est un truc de ce genre qu'il faut faire, oui.
    Mais il serait plus sûr de juste mettre tes articles dans une Liste<Article> et de sérialiser et désérialiser cette liste.

    Cela aurait aussi pour effet que finalement ta classe FichierObjet, pas très pratique, ne fera rien elle-même et devrait disparaître.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club
    Homme Profil pro
    Developpeur Android
    Inscrit en
    Février 2015
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 104
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par thelvin Voir le message
    C'est un truc de ce genre qu'il faut faire, oui.
    Mais il serait plus sûr de juste mettre tes articles dans une Liste<Article> et de sérialiser et désérialiser cette liste.

    Cela aurait aussi pour effet que finalement ta classe FichierObjet, pas très pratique, ne fera rien elle-même et devrait disparaître.
    Merci bcp pour cette réponse.
    Donc si j'ai bien compris, quand tu parles de liste, c'est un Arraylist ? C'est une bonne idée en effet.

    Concernant la Classe FichierObjet, je pensai que c'était une bonne pratique que d'isoler ce type de code !

    Merci quand même. Là je travaille sur la sérialisation en XML. pas évident pour un débutant comme moi, mais ça va venir

    Bonne fin de week-end

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par bomatch Voir le message
    Donc si j'ai bien compris, quand tu parles de liste, c'est un Arraylist ? C'est une bonne idée en effet.
    Bah pour faire simple quand on part de rien, oui, c'est mieux avec une ArrayList.
    Mais si je n'ai pas précisé quel type de liste, c'est parce que ce n'est pas important.

    Citation Envoyé par bomatch Voir le message
    Concernant la Classe FichierObjet, je pensai que c'était une bonne pratique que d'isoler ce type de code !
    Isoler la technique de sérialisation et de désérialisation, à la rigueur, pourquoi pas.

    Mais ce qui ne va pas, c'est qu'on appelle le constructeur en lui passant en paramètre, et qu'ensuite en fonction de ce paramètre, on a le droit d'appeler soit la lecture soit l'écriture.
    Ce n'est pas bon. Il ne faut pas rendre possible une mauvaise séquence, comme ouvrir en lecture et essayer ensuite d'écrire.
    De manière générale quand un objet sert à écrire il doit proposer des méthodes d'écriture mais pas de lecture, et quand il sert à lire il doit proposer des méthodes de lecture mais pas d'écriture.
    Ce qui voudrait dire deux classes différentes

    ... Sauf que... Si tu utilises des listes, tu n'as pas besoin d'instancier des objets à utiliser au fur et à mesure. Des méthodes de classe à appeler une fois suffiront. Par exemple :

    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
    25
    26
      // on isole le nom du fichier : ok 
      private static final String NOM_FICHIER = "stock.txt";
     
      // vu que j'utilise la classe Files, je construis le Path une fois pour toutes.
      private static final Path PATH_FICHIER = Paths.get(NOM_FICHIER);
     
      public static void ecrire(List<Article> articles) throws IOException {
        // le try assure que ce qu'on ouvre au début, on le ferme à la fin.
        try(
          OutputStream os = Files.newOutputStream(PATH_FICHIER);
          ObjectOutputStream out = new ObjectOutputStream(os);
        ) {
          out.writeObject(articles);
        }
      }
     
      @SuppressWarnings("unchecked") // on accepte que la désérialisation peut en théorie contenir des données invalides.
      public static List<Article> lire() throws IOException, ClassNotFoundException {
        // le try assure que ce qu'on ouvre au début, on le ferme à la fin.
        try(
          InputStream is = Files.newInputStream(PATH_FICHIER);
          ObjectInputStream in = new ObjectInputStream(is);
        ) {
          return (List<Article>)in.readObject();
        }
      }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Homme Profil pro
    Developpeur Android
    Inscrit en
    Février 2015
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 104
    Points : 68
    Points
    68
    Par défaut
    Ouahhhh !! Super clair !

    Tu as tout à fait raison.
    Je vais travailler en ce sens.

    Merci pour tes conseils.

    @+

    Bomatch


    PS: Là tu viens à la fois de me donner du poisson mais aussi de m'apprendre à pêcher
    Mais je suis bien loin de vider le lac

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

Discussions similaires

  1. Sauvegarder plusieurs images dans un seul fichier
    Par thetom dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 17/08/2009, 12h35
  2. Réponses: 12
    Dernier message: 03/06/2008, 17h54
  3. Réponses: 2
    Dernier message: 22/09/2007, 15h37
  4. Réponses: 5
    Dernier message: 18/04/2007, 18h57
  5. Réponses: 3
    Dernier message: 07/01/2007, 16h48

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