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 :

serialisation et lecture dans fichier


Sujet :

Langage Java

  1. #1
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Par défaut serialisation et lecture dans fichier
    Bonjour je voudrais avoir un peu d'aide concernant la serialization et lecture dans un fichier, voici mon 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
     
    try
    		{
        		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(jobsFile));
        		while(jobsFile.length() != -1)
        		{
        			TestObject job = (TestObject)ois.readObject();
        			listJob.add(job);
        		}
    		}
        	catch(IOException e)
    		{
        		System.out.println("IOException : ");
        		e.printStackTrace();
    		}
    J'ai un EOFException qui est lancé, je me doute que cela provient de mon while, donc je voudrais savoir comment lire tout les objets du fichiers jusqu'au dernier. Qu'est ce qu'il faut mettre dans la boucle while?
    Merci

  2. #2
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    En dessous du bloc "catch(IOException ioe)", tu rajoutes un "catch(EOFException eofe)"

    [EDIT] tu devrais pas rajouter un "catch(ClassNotFoundException cnfe)" lors de ton appel à readObject ??

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu peux utiliser la méthode available() de la classe ObjectInputStream.

    Autre remarque : pense à fermer ton flux dans un bloc finally

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    try {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(jobsFile));
        try {
            while(ois.available() > 0) {
                TestObject job = (TestObject)ois.readObject();
                listJob.add(job);
            }
        } finally {
            ois.close();
        }
    } catch(IOException e) {
        System.out.println("IOException : ");
        e.printStackTrace();
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par iohack
    En dessous du bloc "catch(IOException ioe)", tu rajoutes un "catch(EOFException eofe)"
    c'est au dessus, sinon, étant donné que EOFException dérive de IOException, l'exception sera attrapée dans le premier catch et ne passera jamais dans le second (d'ailleur le compilateur ne te laissera pas faire ).
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Au temps pour moi

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par le y@m's
    Tu peux utiliser la méthode available() de la classe ObjectInputStream.
    Je suis allez un peu trop vite , en fait cela ne marche pas, il vaut mieux utiliser la EOFException.
    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
    try {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(jobsFile));
        try {
            Boolean b = true;
            while(b) {
                TestObject job = (TestObject)ois.readObject();
                listJob.add(job);
            }
        } finally {
            ois.close();
        }
    } catch(EOFException e) {
        System.out.println("Fin du fichier atteint");
    } catch(IOException e) {
        System.out.println("IOException : ");
        e.printStackTrace();
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Il serait peut-être même plus élégant de gérer l'EOFException comme suit :
    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
    try {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(jobsFile));
        try {
            Boolean b = true;
            while(b) {
                try {
                    TestObject job = (TestObject)ois.readObject();
                    listJob.add(job);
                catch(EOFException e) {
                    b = false;
                } 
            }
        } finally {
            ois.close();
        }
    } catch(IOException e) {
        System.out.println("IOException : ");
        e.printStackTrace();
    }
    Sinon, si c'est toi qui gère la sérialisation, pourquoi ne pas directement sérialiser la List de tes TestObject ? ainsi tu n'aurais plus de boucle puisque tu désérialiserais directement la List.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  8. #8
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Par défaut
    Salut l'exception ne se lance plus par contre je sérialise 2 objets dans un fichier et dans ma liste je me retrouve qu'avec le premier objet?
    Voici le code complet :
    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
     
    File jobsFile = new File("c:\\Dossiers\\TestObject.txt");
        	List listJob = new ArrayList();
     
        	if(jobsFile.length() == -1)
        	{
        		//Création d'une liste d'objet test.
        		TestObject job1 = new TestObject();
        		job1.setNom("QJMAIL");
        		job1.setEtape("JSGD_03");
        		job1.setMachine("SWR01");
        		job1.setOddjobXML(new File("C:\\Dossiers\\projet_Open\\jobSamples\\examples\\userguide\\first1.xml"));
     
        		TestObject job2 = new TestObject();
        		job2.setNom("DJACTIF");
        		job2.setEtape("JSGD_01");
        		job2.setMachine("SWR04");
        		job2.setOddjobXML(new File("C:\\Dossiers\\projet_Open\\jobSamples\\examples\\userguide\\first2.xml"));
     
        		TestObject.saveToFile(job1, jobsFile);
        		TestObject.saveToFile(job2, jobsFile);
    		}
     
        	try
    		{
        		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(jobsFile));
        		try
    			{
        			boolean b = true;
        			try
    				{
        				while(b)
                		{
                			TestObject job = (TestObject)ois.readObject();
                			//String name = job.getNom();
                			//System.out.println(name);
                			listJob.add(job);
                		}
    				}
        			catch(EOFException e)
    				{
    	    			b = false;
    				}
    			}
        		finally
    			{
        			ois.close();
    			}
     
    		}
        	catch(IOException e)
    		{
        		System.out.println("IOException : ");
        		e.printStackTrace();
    		}
     
     
        	request.setAttribute(Constants.LIST_JOB, listJob);
     
     
            // Finish with
            return (mapping.findForward("listeDiff"));
    si tu vois d'autre chose dans le code qui ne sont pas correct n'hésite pas à me le faire remarqué.

  9. #9
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    A mon avis, le problème vient du fait que tu appel deux fois ta méthode saveToFile() (dont tu aurais pu mettre le code ) et je suppose que l'un des deux objet doit être écrasé dans le fichier.

    Comme je te l'ai dit dans mon précédent post, la meilleure solution est encore de sérialiser directement la List.
    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
     
    List listJob = new ArrayList();
    try {
        File jobsFile = new File("c:\\Dossiers\\TestObject.txt");
        if(jobsFile.length() == -1) {
            //Création d'une liste d'objet test.
            TestObject job1 = new TestObject();
            job1.setNom("QJMAIL");
            job1.setEtape("JSGD_03");
            job1.setMachine("SWR01");
            job1.setOddjobXML(new File("C:\\Dossiers\\projet_Open\\jobSamples\\examples\\userguide\\first1.xml"));
            TestObject job2 = new TestObject();
            job2.setNom("DJACTIF");
            job2.setEtape("JSGD_01");
            job2.setMachine("SWR04");
            job2.setOddjobXML(new File("C:\\Dossiers\\projet_Open\\jobSamples\\examples\\userguide\\first2.xml"));
     
            List saveList = new ArrayList();
            saveList.add(job1);
            saveList.add(job2);
     
            // sérialisation de la List
            ObjectOutpuStream oos = new ObjectOutputStream(new FileOutpuStream(jobsFile));
            try {
                oos.writeObject(saveList);
                oos.flush();
            } finally {
                oos.close;
            }
        }
     
        // désérialisation de la List
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(jobsFile));
        try {
            listJob = (List) ois.readObject();
        } finally {
            ois.close();
        }
    } catch(IOException e) {
        System.out.println("IOException : ");
        e.printStackTrace();
    }
    request.setAttribute(Constants.LIST_JOB, listJob);
    // Finish with
    return (mapping.findForward("listeDiff"));
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  10. #10
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Par défaut
    Le code de saveToFile est trés simple, n'y a til pas un moyen d'ajouter a la suite de ce fichier?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static void saveToFile(TestObject object, File file)
    	{
    		try
    		{
    			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
    			oos.writeObject(object);
    		}
    		catch(IOException e)
    		{
    			e.printStackTrace();
    		}
    	}

  11. #11
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Par défaut
    Y a til moyen de modifier le code de saveToFile afin que si le fichier n'est pas vide, on rajoute les nouveau objet serialisé a la suite?

  12. #12
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Un petit coup d'oeil dans la Javadoc de la classe FileOutputStream t'aurais permis de voir que celle-ci possède ce constructeur .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  13. #13
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Par défaut
    Bon je pense que je vais écouté sagement ton conseil et serialiser la liste car en utilisant FileOutputStream(File, append) j'ai d'autres exception genre streamcorruptedexception et puis sa devient compliqué la donc voila. Merci pour ton aide
    ++

  14. #14
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par david06600
    Bon je pense que je vais écouté sagement ton conseil et serialiser la liste car en utilisant FileOutputStream(File, append) j'ai d'autres exception genre streamcorruptedexception et puis sa devient compliqué la donc voila.
    Cette solution est effectivement beaucoup plus simple et donc plus appropriée .

    PS : pense au tag
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

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

Discussions similaires

  1. Petite base de donnée en C (lecture dans fichier)
    Par oc_alex86 dans le forum Débuter
    Réponses: 2
    Dernier message: 19/11/2008, 18h03
  2. Lecture dans fichier excel
    Par jojo456 dans le forum Débuter
    Réponses: 16
    Dernier message: 30/05/2008, 11h06
  3. Erreur dans la lecture dans fichier M-file
    Par Pedrozito dans le forum MATLAB
    Réponses: 7
    Dernier message: 22/05/2008, 16h16
  4. ajax lecture dans fichier xml sans serveur
    Par TERRIBLE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/03/2008, 12h19
  5. [XPATH] problème lecture dans fichier XML
    Par DiamonDonald dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/02/2008, 09h57

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