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

avec Java Discussion :

L'archivage d'objet à l'aide d'un flux


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut L'archivage d'objet à l'aide d'un flux
    Bonjour,

    Je suis présentement étudiant et je programme à temps perdu. J'ai débuté sous-peu le java après plusieurs années de modélisation et je fais face régulièrement à plusieurs difficultés. Sauf qu'habituellement, je suis capable de régler ceux-ci moi-même...

    Voilà, pardon si le sujet a déjà été posté, j'ai beaucoup de difficulté à faire le lien être divers projets pour l'instant.

    Dans la livre d'Anne Tasso: Le livre de Java premier langage 5e édition, il y a un projet de classification d'étudiants. Seulement, ils expliquent la notion d'archivage dans un fichier .DAT pour les objets... Lorsque je met en pratique cette ''mise en donnée'', ça plante. Je ''catch'' un IOException à la lecture de celui-ci et lorsque j'écris dans le fichier en question, j'obtient un Exception in thread "main" java.lang.NullPointerException étant donné que ''return'' un ''null''. Voilà le code pour vous imagé la situation.

    Voici le code de gestion, celui qui s'exécute :

    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
    package firstpackage;
    import java.util.*;
    import java.io.*;
    public class GestionClasse {		
    	public static void main(String [] argument)
    	throws IOException, ClassNotFoundException
    	{
    	byte choix = 0;
    	Scanner sc = new Scanner(System.in);
    	Classe C = new Classe();
     
    	Fichier F = new Fichier();
    	if(F.ouvrir("Lecture"))
    	{
    	C = F.lecture();
    	F.fermer();
    	}
     
    	do {
    		System.out.println("1. Ajouter un etudiant");
    		System.out.println("2. Afficher la classe");
    		System.out.println("3. Supprimer un etudiant");
    		System.out.println("4. Rechercher un etudiant");
    		System.out.println("5. Sortir");
     
    		choix = sc.nextByte();
    		switch(choix) {
    Voici la classe Fichier, où je communique l'archivage :

    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
    package firstpackage;
    import java.io.*; // Pour la gestion de fichiers
    public class Fichier {
     
    	private ObjectOutputStream ofW;
    	private ObjectInputStream ofR;
    	private char mode;
    	private String nomDeFichier = "Classe.dat";
     
    	public boolean ouvrir(String s) // (fichier, le mode)
    		{ try {
    		mode = (s.toUpperCase()).charAt(0); // Premiere lettre du mode s
    		if(mode == 'R' || mode == 'L')// Ouverture de lecture
    			ofR = new ObjectInputStream(new FileInputStream(new File(nomDeFichier)));
    		else if (mode == 'W' || mode == 'E')// Ouverture d'ecriture
    			ofW = new ObjectOutputStream(new FileOutputStream(new File(nomDeFichier)));
    		return true;
    	}
    	catch (IOException e) {
    		return false; }
    	}
     
    	public void ecriture(Classe tmp)
    	{ try {
    		if(tmp != null) ofW.writeObject(tmp);
    	}
    	catch (IOException e){
    	}
    	}
     
    	public Classe lecture()
    	{ try {
    		Classe tmp = (Classe) ofR.readObject();
    		return tmp;
    	}
    	catch (IOException e){ System.out.println("Erreur de lecture?");
    	}
    	catch (ClassNotFoundException e){
    	}
    		return null;
    	}
     
    	public void fermer() throws IOException
    	{
    		if(mode == 'E' || mode == 'W') ofW.close();
    		else if(mode =='L' || mode == 'R') ofR.close();
    	}
    }
    Et finalement, le début de la classe Classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package firstpackage;
    import java.util.*;
    import java.io.*;
    public class Classe implements Serializable {
    private HashMap<String, Etudiant> liste; // Liste dynamique
    Scanner sc = new Scanner(System.in);
     
    	public Classe() // Initiation de la liste dynamique
    	{
    		liste = new HashMap<String, Etudiant>(); // <> mode generique!
    Selon mon pif, l'erreur est à la ligne 36 de la classe Fichier. Ce qui explique que la première instruction que mon programme applique est : Erreur de lecture?

    Merci énormément de votre lecture, compréhension et surtout de votre aide!

    Amicalement,

    Kevin Sheehy

  2. #2
    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
    Là tu nous parles de la lecture, mais elle est impossible tant que ce fichier n'a pas été écrit. Comment t'y prends-tu pour l'écrire ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Là tu nous parles de la lecture, mais elle est impossible tant que ce fichier n'a pas été écrit. Comment t'y prends-tu pour l'écrire ?
    Mmmh, Pas si fou ça..


    Ici, dans ma classe Fichier il y a l'objet pour écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public void ecriture(Classe tmp)
    	{ try {
    		if(tmp != null) ofW.writeObject(tmp);
    	}
    	catch (IOException e){
    	}
    	}
    À la fin de ma classe de gestion d'étudiants, j'utilise une espèce de sauvegarde lorsque l'utilisateur choisit de quitter le logiciel dans le menu switch.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case 5 :
    				System.out.println("Sauvegarde en cours");
    				F.ouvrir("Ecriture");
    				F.ecriture(C);
    				F.fermer();
    				System.exit(0);
    		default : System.out.println("Pas d'option");
    Psssssst! J'ai remarqué aussi qu'au moment de l'écriture, il catch un IOException qui l'empêche d'écrire... Puis lorsque je remplace le try ... catch par un throws IOException, j'obtient ça : java.io.NotSerializableException

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Les catch vide c'est le mal absolu !!!
    Il vaut mieux laisser remonter l'exception : le programme plantera mais on aura alors une belle stacktrace indiquant la source d'erreur.
    (et dans une apps en production on pourra greffer un exception-handler chargé de reporter cela proprement).




    Sinon ta classe "Fichier" est une fausse-bonne-idée.
    Elle est inutilement complexe et n'apporte pas grand chose et ne fait qu'englober une méthode ou un code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	F.ouvrir("Ecriture"); // new ObjectInputStream(new FileInputStream(...));
    		F.ecriture(C); // writeObject()
    		F.fermer(); // close()
    Pire : cela peut aboutir à des usages incorrect (ouvrir en "Lecture" puis utiliser la méthode "écriture()").

    Pour moi tu pourrais remplacer cela par deux méthodes static qui s'occuperait de tous le traitement.
    Par exemple (avec un try-with-ressource pour libérer proprement les ressources) :
    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
    public class Fichier {
     
    	public static Classe lecture(String fichier) throws IOException, ClassNotFoundException {
    		try (FileInputStream fis = new FileInputStream(fichier);
    				ObjectInputStream ois = new ObjectInputStream(fis)) {
    			return (Classe) ois.readObject();
    		}
    	}
     
    	public static void ecrire(String fichier, Classe valeur) throws FileNotFoundException, IOException {
    		try (FileOutputStream fos = new FileOutputStream(fichier);
    				ObjectOutputStream oos = new ObjectOutputStream(fos)) {
    			oos.writeObject(valeur);
    			oos.flush();
    		}
    	}
    }
    L'avantage c'est que tu peux ecrire/lire dans le fichier avec une simple ligne de code, et que tu ne peux pas te tromper


    Si tu n'utilises pas encore Java 7 il faudra utiliser des try/finally pour la libération des ressources :
    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
    	public static Classe lecture(String fichier) throws IOException, ClassNotFoundException {
    		FileInputStream fis = new FileInputStream(fichier);
    		try {
    			ObjectInputStream ois = new ObjectInputStream(fis);
    			try {
    				return (Classe) ois.readObject();
    			} finally {
    				ois.close();
    			}
    		} finally {
    			fis.close();
    		}
    	}
     
     
    	public static void ecrire(String fichier, Classe valeur) throws FileNotFoundException, IOException {
    		FileOutputStream fos = new FileOutputStream(fichier);
    		try {
    			ObjectOutputStream oos = new ObjectOutputStream(fos);
    			try {
    				oos.writeObject(valeur);
    				oos.flush();
    			} finally {
    				oos.close();
    			}
    		} finally {
    			fos.close();
    		}
    	}

    a++

  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
    Ouaip ben 'faudrait peut-être l'afficher cette IOException. Sinon on va pas vraiment deviner de quoi elle se plaint.
    Au passage, il faut juste jamais faire de catch d'une Exception sans l'afficher, sauf peut-être, éventuellement, quand on sait que cette Exception va arriver parfois, pourquoi, et que ce n'est pas un problème.
    En fait, pourquoi faire un catch, ici ? Pourquoi pas dire que toutes les méthodes ont throws IOException ? De toute façon s'il y a une erreur rien ne peut marcher, alors à quoi sert un catch ?


    Mais bon, t'as probablement un soucis sur les droits d'écriture.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Les catch vide c'est le mal absolu !!!
    J'adore!

    Merci énormément Thelvin et adiGuba!

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

Discussions similaires

  1. Délimiter un objet à l'aide d'un rectangle
    Par boudou dans le forum Images
    Réponses: 6
    Dernier message: 28/05/2008, 00h11
  2. Deplacement des objets à l'aide des touches
    Par AmineDev9 dans le forum MFC
    Réponses: 4
    Dernier message: 07/05/2008, 16h02
  3. Archivage d'objets ( et leurs sources)
    Par Arrnno dans le forum AS/400
    Réponses: 6
    Dernier message: 03/04/2008, 14h32
  4. [POO] création d'objets à l'aide de "&"
    Par zakaria_ dans le forum Langage
    Réponses: 3
    Dernier message: 14/05/2007, 19h35
  5. Réponses: 5
    Dernier message: 21/09/2006, 09h30

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