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

AWT/Swing Java Discussion :

probléme avec la sérialisation


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Par défaut probléme avec la sérialisation
    Bonjour
    Mon souci est le suivant:j'ai stocké des données dans un fichier(etudiant.txt) grâce à la sérialisation.Le problème est que je ne sais pas comment récupérer les données que j'ai stockées et les afficher.
    Ensuite si j'essaie de mettre 2 enregistrements dans le fichier,est ce que le 2e va écraser le premier?
    Merci d'avance.
    En fait j'ai 2 classes;voici une partie de la 1ere:

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    public void actionPerformed(ActionEvent ev) {
     
     
    		if(ev.getSource().equals(boutonOk)){
    			Etudiant etud=new Etudiant();
     
    			etud.setNom(jtNom.getText());
    			etud.setPrenom(jtPrenom.getText());
     
    			try {
    				FileOutputStream fos=new FileOutputStream("etudiant.txt");
    				ObjectOutputStream oos=new ObjectOutputStream(fos);
    				oos.writeObject(etud);
    				oos.flush();
    				oos.close();
    				   JOptionPane.showMessageDialog(null,"Sauvegarde réussie!");
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
     
    		if(ev.getSource().equals(boutonAfficher)){
    			/*Etudiant fichier=new Etudiant();
     
    			//fichier.setTitre(getTxttitre().getText());
    			//fichier.setPrenom(getTxtcontenu().getText());
     
    			try {
    				System.out.println("reussi");
    				System.out.println("creation de : " + fichier);
    				FileInputStream fis=new FileInputStream("etudiant.txt");
     
    				ObjectInputStream ois=new ObjectInputStream(fis);
     
    			/*	String s = (String)ois.readObject();
    				System.out.println(s);*/
    				//Etudiant f= (Etudiant)ois.readObject();
     
    						//jtNom.setText(f.getPrenom());
    				//jtPrenom.setText(f.getPrenom());
    			//	ois.close();
    		//	} catch (Exception e) {
    				//e.printStackTrace();
    		//	}
    	Etudiant p = null;
     
    			try {
    				// ouverture d'un flux d'entrée depuis le fichier "etudiant.txt"
    				FileInputStream fis = new FileInputStream("etudiant.txt");
    				// création d'un "flux objet" avec le flux fichier
    				ObjectInputStream ois= new ObjectInputStream(fis);
    				try {	
    					// désérialisation : lecture de l'objet depuis le flux d'entrée
    					p = (Etudiant) ois.readObject(); 
    				} finally {
    					// on ferme les flux
    					try {
    						ois.close();
    					} finally {
    						fis.close();
    					}
    				}
    			} catch(IOException ioe) {
    				ioe.printStackTrace();
    			} catch(ClassNotFoundException cnfe) {
    				cnfe.printStackTrace();
    			}
    			if(p != null) {
    				System.out.println(p + " a ete deserialise");
    			}
     
    		}
     
    Et voici la classe Etudiant:
     
    public class Etudiant implements Serializable{
     
    	private String nom;
    	private String prenom;
     
    	public String getNom() {
    		return nom;
    	}
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
    	public String getPrenom() {
    		return prenom;
    	}
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
    	public Etudiant() {
     
    	}
     
    }

  2. #2
    Membre expérimenté

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Par défaut
    La FAQ répond a ce genre de question :

    Comment écrire en fin de fichier : http://java.developpez.com/faq/java/...FICHIER_append
    (la méthode est la même en utilisant la classe FileOutputStream)

    Comment lire un fichier ligne par ligne : http://java.developpez.com/faq/java/...eLigneParLigne

    et surtout :

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Par défaut
    Merci,je m'y mets tout de suite

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Par défaut
    Ok je vois.J'ai aussi lu quelque part qu'on pouvait écrire en fin de fichier en ajoutant tout simplement "true" comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FileOutputStream fos=new FileOutputStream("etudiant.txt",true);
    				ObjectOutputStream oos=new ObjectOutputStream(fos);
    				oos.writeObject(etud);
    				oos.flush();
    				oos.close();
    N'est ce pas?
    Ensuite concernant la lecture ligne par ligne j'ai combiné les FileOutputStream et les BufferedReader() c'est à dire pour sauvegarder les données dans le fichier je fait appel aux FileOutputStream,et pour l'affichage j'utilise BufferedReader.Voici le code:

    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
    56
    public void actionPerformed(ActionEvent ev) {
     
     
    		if(ev.getSource().equals(boutonOk)){
    			Etudiant etud=new Etudiant();
     
    		int		id = Integer.parseInt(jtNum.getText());				
    			try {
     
    				etud.setNum(id);			
    				etud.setNom(jtNom.getText());
    				etud.setPrenom(jtPrenom.getText());
     
     
    				FileOutputStream fos=new FileOutputStream("etudiant.txt",true);
    				ObjectOutputStream oos=new ObjectOutputStream(fos);
    				oos.writeObject(etud);
    				oos.flush();
    				oos.close();
    				   JOptionPane.showMessageDialog(null,"Sauvegarde réussie!");
    				   jtNum.setText(null);
    				   jtNom.setText(null);
    				   jtPrenom.setText(null);
    			} catch (Exception e) {
     
    				 JOptionPane.showMessageDialog(null,"Sauvegarde non réussie!");
    			}
    		}
     
    		if(ev.getSource().equals(boutonAfficher)){
     
    			try{
    				// Création du flux bufférisé sur un FileReader, immédiatement suivi par un 
    				// try/finally, ce qui permet de ne fermer le flux QUE s'il le reader
    				// est correctement instancié (évite les NullPointerException)
     
    				BufferedReader buff = new BufferedReader(new FileReader("etudiant.txt"));
     
    				try {
    				String line;
    				// Lecture du fichier ligne par ligne. Cette boucle se termine
    				// quand la méthode retourne la valeur null.
    				while ((line = buff.readLine()) != null) {
    				System.out.println(line);
    				//faites ici votre traitement
     
    				}
    				} finally {
    				// dans tous les cas, on ferme nos flux
    				buff.close();
    				}
    				} catch (IOException ioe) {
    				// erreur de fermeture des flux
    				System.out.println("Erreur --" + ioe.toString());
    				}
    }
    apparemment ça marche mais les données qu'il m'affiche sont illisibles,on dirait du chinois mélangé à du turc.Comment faire pour afficher les données normalement?
    Et comment afficher le nombre de lignes de mon choix?
    ( merci beaucoup )

  5. #5
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Salut,

    qu'entends-tu par afficher les données normalement?

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bah en même temps la sérialisation c'est pas prévu pour faire des fichiers lisibles à la base...


    A la limite tu peux faire de la sérialisation XML avec l'XMLEncoder

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Par défaut
    Afficher les données normalement,ça veut dire quand j'affiche les données qui sont dans le fichier,j'ai des trucs bizarres comme ceci:

    :¨ö:¨ö:¨ö:¨ö:¨ö:¨ö:¨ö:¨ö :¨ö:¨ö:¨ö

    Donc y'a aucun moyen d'afficher les données lisiblement?

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Citation Envoyé par momjunior Voir le message
    Afficher les données normalement,ça veut dire quand j'affiche les données qui sont dans le fichier,j'ai des trucs bizarres comme ceci:

    :¨ö:¨ö:¨ö:¨ö:¨ö:¨ö:¨ö:¨ö :¨ö:¨ö:¨ö

    Donc y'a aucun moyen d'afficher les données lisiblement?

    Je répète, la sérialisation n'est en aucun cas prévue pour créer des fichiers lisibles par un humain.

    Si tu veux créer des fichiers lisibles dans un éditeur de texte, arme toi du nécessaire, c'est à dire d'un file writer et tu fais tout à la mimine ou d'un serialiszer/deserializer XML comme XMLEncoder ou XStream par exemple.

    Par essence un ObjectOutputStream envoie des données binaires dans un fichier, par des données de type texte.

  9. #9
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Par défaut
    Ok je vois,je vais changer de méthode alors.Mais je vois absolument pas l'intérêt de la sérialisation des données en binaire.
    Encore merci.

  10. #10
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Le but de la serialisation c'est de représenter un objet de telle manière qu'une autre JVM puisse recréer cet objet.
    Ca peut être utile pour sauvegarder des données d'une exécution à une autre par exemple, ou alors pour envoyer un objet directement sur le réseau.

    Comme dit plus haut ce n'est pas fait pour être lu par un humain mais par un autre programme java.
    Re-comme dit plus haut, tu peux aussi gérer toi-même la sérialisation/déserialisation de telle manière que ce soit lisible par toi (en XML par exemple). Mais comme ce n'est pas le but de base, c'est à toi d'implémenter ça.

  11. #11
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bah tout simplement faire transiter des objets dans des flux par exemple (c'est le genre de technique utilisée dans RMI par exemple, enfin pour faire vraiment simple, ou encore CORBA).

    Grosso modo la sérialisation écrit l'objet sous forme binaire, et de fait cet objet pourra être lu par toute machine virtuelle java (enfin de version identique ou supérieure).

    Ou alors sauvegarder l'état d'un objet complexe (composant Swing par exemple avec tout ce que ça implique au niveau données et positionnement et ainsi de suite).

  12. #12
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    sans oublier qu'il faut que la classe soit dans le path de la jvm qui veut lire les données, et qu'elle soit de version compatible...

    c'est assez contraignant à maintenir, mais très rapide à implémenter. sympa si on veut stocker des données sacrifiables ou à faible durée de vie


  13. #13
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Par défaut
    Ok je comprends,je m'attaque au xml donc.
    Merci.

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

Discussions similaires

  1. Problème de dé-sérialisation d'entité avec rake
    Par supergeoffrey dans le forum Ruby
    Réponses: 1
    Dernier message: 22/08/2012, 11h46
  2. Problème avec Sérialisation des tableaux de Axis 1.4
    Par khoufouq dans le forum Services Web
    Réponses: 1
    Dernier message: 26/07/2012, 09h29
  3. Problème avec la sérialisation
    Par subzero01 dans le forum MFC
    Réponses: 6
    Dernier message: 30/06/2010, 19h06
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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