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

Java Discussion :

Recuperer plusieurs objet stockés dans un fichier via ObjectInputStream


Sujet :

Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut Recuperer plusieurs objet stockés dans un fichier via ObjectInputStream
    Bonjour,

    Je voudrais recuperer les objets stockés dans un fichier texte.
    Le script que j'ai fait ne recupere que le premier objet stocké dans le fichier, pas le reste.
    Savez vous comment faire svp ?

    Voici la classe 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
    import java.io.*;
    import java.util.*;
     
    public class FamilyMember implements Serializable {
     
    	String nom;
    	int age;
     
    	FamilyMember() {
    		Scanner lectureClavier = new Scanner(System.in);
    		System.out.println("Rentrer le nom de la personne");
    		nom = lectureClavier.next();
    		System.out.println("Rentrer l age de la personne");
    		age = lectureClavier.nextInt();
    	}
    	FamilyMember(String n,int a) {
    		nom = n;
    		age = a;
    	}
    	public void afficherMembreFamille() {
    		System.out.println(nom+" a "+age+" ans.");		
    	}
     
    }
    Et voici le 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    import java.io.*;
     
    public class FamilyMgmt {
    	public static void main(String[] args) throws FileNotFoundException,IOException,ClassNotFoundException, StreamCorruptedException {
     
    		FamilyMember FM1 = new FamilyMember();
    		FamilyMember FM2 = new FamilyMember();
     
    		//Stocker dans fichier
     
    		ObjectOutputStream ofW = new ObjectOutputStream(new FileOutputStream("fileFamilyMembers.txt",true));
    		ofW.writeObject(FM1);
    		ofW.writeObject(FM2);
    		ofW.close();
     
    		//Obtenir le contenu du fichier
    		ObjectInputStream ofR = new ObjectInputStream(new FileInputStream("fileFamilyMembers.txt"));
     
    		try {
    			while (true) {
    				FamilyMember newFM = (FamilyMember) ofR.readObject();
    				newFM.afficherMembreFamille();
    			}
    		}
    		catch (Exception e) {
    			System.out.println("passe A");
    		}
     
    		try {
    			while (true) {
    				FamilyMember newFM = (FamilyMember) ofR.readObject();
    				newFM.afficherMembreFamille();
    			}
    		}
    		catch (Exception e) {
    			System.out.println("passe B");
    		}
     
     
     
     
    	}
     
    }
    Merci
    Cedric

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 105
    Par défaut
    Bizarre ici ça marche très bien.

    Nom : work.png
Affichages : 381
Taille : 3,9 Ko

    Par contre je ne comprends pas vraiment l'intérêt d'avoir 2 boucle while.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    est il possible que le probleme soit lié au fait que je passe par le command line pour executer le programme ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 105
    Par défaut
    Citation Envoyé par cedricleval Voir le message
    est il possible que le probleme soit lié au fait que je passe par le command line pour executer le programme ?
    Il n'y à, a priori, aucunes raisons. Ici ça marche, désolé de ne pas pouvoir t'en dire plus. (testé dans la console eclipse et en ligne de commande).

    Nom : AUCUNEIDEE.png
Affichages : 422
Taille : 9,7 Ko
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Je soupçonne que le problème soit dans le true de new FileOutputStream("fileFamilyMembers.txt",true) . Ca signifie que l'écriture dans le fichier commence à la fin du fichier existant, et non pas qu'il le réécrit depuis le début.

    Pour repartir du début, il faut donc effacer le fichier.

    Et vu que ça utilise la sérialisation native Java, on ne peut pas écrire le fichier en plusieurs fois. Bref, il faudrait enlever ce true qui est forcément faux. Puis réessayer du début.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    Merci Thelvin, tu as raison, en enlevant le true, ca marche correctement.

    Par contre, moi ce que je voudrais c'est bien stocker des objets en plusieurs fois dans un fichier. Pour pouvoir ensuite, ressortir ces objets.
    Est ce possible en Java ?

    Je me demande aussi comment ca peut marcher avec le true chez d'autres et pas chez moi... (wax78, tu peux bien confirmer stp que c'est le cas chez toi, tu avais laissé true ?)

    Merci
    Cedric

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par cedricleval Voir le message
    Par contre, moi ce que je voudrais c'est bien stocker des objets en plusieurs fois dans un fichier. Pour pouvoir ensuite, ressortir ces objets.
    Est ce possible en Java ?
    Java est Turing-complet. Si quelque chose peut être fait avec un langage, ça peut être fait en Java. (Du moins tant qu'on parle de lire/écrire en mémoire, dans des fichiers ou des réseaux. Piloter une carte graphique est une autre histoire, hors des définitions de Turing).

    Donc oui c'est possible en Java. Il faut d'abord lire toutes les données contenues dans le fichier, dans une List<FamilyMember>. Puis y ajouter les membres que tu veux ajouter au fichier. Puis réécrire le fichier entièrement, avec les objets que tu viens de lire et ceux que tu viens d'y ajouter.


    Si ça ne te plaît pas de faire comme ça :
    - c'est pourtant ce que font tous les programmes, en Java ou autre
    - pas le choix si tu utilises ObjectOutputStream/ObjectInputStream. Mais tu pourrais convertir ta liste de FamilyMembers en CSV par exemple. Du coup pour ajouter des données au fichier CSV il suffit de les ajouter à la fin.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 105
    Par défaut
    Citation Envoyé par cedricleval Voir le message
    Je me demande aussi comment ca peut marcher avec le true chez d'autres et pas chez moi... (wax78, tu peux bien confirmer stp que c'est le cas chez toi, tu avais laissé true ?)
    Je n'ai pas lancer plusieurs fois le programme, mais comme le dit Thelvin, laisser le truc va faire un append a la fin du fichier. Donc avec le code que tu as, si tu le lances plusierus fois tu va bien faire grossir ton fichier, mais tu ne liras jamais que les 2 premiers du fichier. (D'ailleurs on peut le voir sur le 2ème screenshot le problème je n'avais même pas fait gaffe.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    Merci, je vois effectivement dans le fichier texte le problème avec la "déclaration de serialization".
    Pour mon premier fichier avec juste deux personnes ca donne ca:

    ¬í sr FamilyMemberâZb[*“e I ageL nomt Ljava/lang/String;xp
    t noesq ~ t quentin
    Et ensuite ça donne ça:
    ¬í sr FamilyMemberâZb[*“e I ageL nomt Ljava/lang/String;xp
    t noesq ~ t quentin¬í sr FamilyMemberâZb[*“e I ageL nomt Ljava/lang/String;xp *t cedricsq ~ t simon¬í sr FamilyMemberâZb[*“e 
    Du coup j'imagine qu'il ne peut pas déserializer ensuite le deuxième ajout.

    Je vais essayer la méthode avec la liste de Thelvin.

    Bonne journée

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    Bonjour,

    J'ai suivi vos conseils et tout marche, je partage juste mon code pour info. N'hésitez pas si vous avez des remarques d'amélioration de présentation / syntaxe.

    Merci

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    import java.util.*;
    import java.io.*;
     
    public class FamilyMgmt3 {
    	public static void main(String[] args) throws FileNotFoundException,IOException,ClassNotFoundException, StreamCorruptedException,EOFException {
     
     
    // CREER LE FICHIER TEXTE SI EXISTE PAS
     
    		File fichierACreer = new File("fileFamilyMembers2.txt");
    		fichierACreer.createNewFile();
     
    // CREER ARRAY LISTE POUR STOCKER LES OBJETS LUS
     
    		ArrayList<FamilyMember> listeObjetsLus = new ArrayList<FamilyMember>();
     
    // LIRE LE CONTENU DU FICHIER ET STOCKER CHAQUE OBJET DANS LA LISTE
    		Boolean resteAlire = false;			
    		try {
    			ObjectInputStream ofR = new ObjectInputStream(new FileInputStream("fileFamilyMembers2.txt"));
    			resteAlire = true;			
    			while (resteAlire==true)
    			{
    				try {
    					FamilyMember newFM = (FamilyMember) ofR.readObject();
    					newFM.afficherMembreFamille();
    					listeObjetsLus.add(newFM);
    					resteAlire = true;	
    				}
    				catch (Exception e) {
    					System.out.println("message de catch sur lecture de l'input");
    					resteAlire=false;
    				}
     
    			}
     
    			ofR.close();
    		}
    		catch (Exception e) {
    				System.out.println("message de catch sur ObjectInputStream");
    				resteAlire=false;			
    		}
     
    // LANCER LA FONCTION MENU EN BOUCLE
    		int choix = 0;
    		Scanner lectureClavier = new Scanner(System.in);
    		while (choix != 5) {
    			afficherMenu();
    			choix = lectureClavier.nextInt();
    			switch (choix) {
    				case 1:
    					afficherContenuFichier(listeObjetsLus);
    					break;
    				case 2:
    					creerMembreDansFichier(listeObjetsLus);
    					break;
    				case 3:
    					enleverMembreDansFichier(listeObjetsLus);
    					break;
    				case 4:
    					mettreAJourMembre(listeObjetsLus);
    					break;
    				case 5:
    					System.out.println("*** FIN DU PROGRAMME ***");
    					break;
    				default:
     
    					System.out.println("Rentrer un nombre entre 1 et 5");
    					break;
    			}
     
    		}
     
    // DETRUIRE LE FICHIER TEXTE
     
    		File fichierADetruire = new File("fileFamilyMembers2.txt");
    		if (fichierADetruire.delete()) {/*System.out.println("***fichier detruit");*/}
    		else {/*System.out.println("***fichier non detruit");*/}
     
    // LE RECREER AVEC UN OUTPUTSTREAM NOURRIS PAR LE CONTENU ENTIER DE LA LISTE FAIRE AUTANT DE WRITE QUE LA TAILLE DE L'ARRAY LIST
     
    		try {
    			ObjectOutputStream ofW = new ObjectOutputStream (new FileOutputStream("fileFamilyMembers2.txt"));	
     
    			for (FamilyMember fm:listeObjetsLus) {
    				fm.afficherMembreFamille();
    				ofW.writeObject(fm);
    			}
    			ofW.close();
    		}
     
    		catch (Exception e) {
    			System.out.println("message de catch sur ObjectOutputStream");
    		}
     
    		System.exit(0);
     
    	}
     
    	public static void afficherMenu() {
    		System.out.println("**** MENU ***");
    		System.out.println("1. Afficher le contenu actuel du fichier");
    		System.out.println("2. Creer un nouveau membre dans le fichier");
    		System.out.println("3. Supprimer un membre du fichier");
    		System.out.println("4. Mettre à jour les infos d'un membre du fichier");
    		System.out.println("5. Sortir");
    	}
     
    	public static void creerMembreDansFichier(ArrayList<FamilyMember> lm) {
    		FamilyMember nouveauMembreAAjouter = new FamilyMember();
    		lm.add(nouveauMembreAAjouter);
     
    	}
     
    	public static void afficherContenuFichier(ArrayList<FamilyMember> lm) {
    		System.out.println("**** CONTENU DU FICHIER ****");
    		for (FamilyMember fm:lm) {
    			fm.afficherMembreFamille();
    		}
    	}
     
    	public static void enleverMembreDansFichier(ArrayList<FamilyMember> lm) {
    		Scanner lectureClavier = new Scanner(System.in);
    		System.out.println("Quel est le nom du membre a supprimer ?");
    		String membreASupprimer =lectureClavier.next();
    		FamilyMember membreFantome = new FamilyMember("n",0); 
     
    		int nombreOccurenceTrouves = 0;
    		for(FamilyMember fm:lm) {
    			if(fm.nom.equals(membreASupprimer)) {
    				membreFantome = fm;
    				nombreOccurenceTrouves++;
    			}
     
    		}
    		if (nombreOccurenceTrouves == 0) {System.out.println("il n y a aucun membre se nommant "+membreASupprimer);}
    		else {lm.remove(membreFantome);}
    	}
     
    	public static void mettreAJourMembre(ArrayList<FamilyMember> lm) {
    		Scanner lectureClavier = new Scanner(System.in);
    		System.out.println("Quel est le nom du membre a mettre a jour ?");
    		String membreAMettreAJour =lectureClavier.next();
     
    		int nombreOccurenceTrouves = 0;
    		for(FamilyMember fm:lm) {
    			if(fm.nom.equals(membreAMettreAJour)) {
    				nombreOccurenceTrouves++;
    				fm.mettreAJourMembreFamille();
    			}
     
    		}
    		if (nombreOccurenceTrouves == 0) {System.out.println("il n y a aucun membre se nommant "+membreAMettreAJour);}
     
    		// passer par une fonction de l'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
    import java.io.*;
    import java.util.*;
     
    public class FamilyMember implements Serializable {
     
    	String nom;
    	int age;
     
    	FamilyMember() {
    		Scanner lectureClavier = new Scanner(System.in);
    		System.out.println("Rentrer le nom de la personne");
    		nom = lectureClavier.next();
    		System.out.println("Rentrer l age de la personne");
    		age = lectureClavier.nextInt();
    	}
    	FamilyMember(String n,int a) {
    		nom = n;
    		age = a;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public int getAge() {
    		return age;
    	}
     
    	public void setNom(String n) {
    		nom = n;
    	}
     
    	public void setAge(int a) {
    		age = a;
    	}
     
    	public void afficherMembreFamille() {
    		System.out.println(nom+" qui a "+age+" ans.");		
    	}
    	public void mettreAJourMembreFamille() {
    		Scanner lectureClavier = new Scanner(System.in);
    		System.out.println("Reconfirmer le nom de la personne");
    		nom = lectureClavier.next();
    		System.out.println("Reconfirmer l age de la personne");
    		age = lectureClavier.nextInt();
    	}
     
    }

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

Discussions similaires

  1. [PowerShell] Rechercher via id un objet json dans un fichier
    Par Lekno dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 16/02/2020, 17h16
  2. Réponses: 3
    Dernier message: 12/11/2009, 15h26
  3. Recuperation d'une chaîne dans un fichier
    Par black is beautiful dans le forum Windows
    Réponses: 3
    Dernier message: 20/03/2006, 19h57
  4. Recuperation des objet ole dans une base SQL
    Par TOPGUN89 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 25/11/2005, 10h14
  5. execution d une requete stockée dans un fichier
    Par ghostdog dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/10/2005, 17h20

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