Partage
  • Partager sur Facebook
  • Partager sur Twitter

exercice garage (bis)

Sujet résolu
    10 avril 2017 à 13:11:00

    Salut à tous!

    Bon, je bloque toujours sur l'exo du garage dans "apprenez à programmer en java", d'ailleurs c'est le même problème que dans mon premier post, mais cette fois-ci il est mieux ciblé.

    Je ne comprends pas pourquoi quand j'écris un objet dans mon fichier, au lieu de l'ajouter à la suite il écrase le précédent :(

    Mon code :

    package bzh.voiture;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    
    public class Garage implements Serializable{
    	
    		private ArrayList<Vehicule> voiture;
    		 
    		public Garage() {
    		}
    		
    		public void addVoiture(Vehicule voit) {
    			ObjectInputStream ois = null;
    			ObjectOutputStream oos = null;
    			ArrayList<Vehicule> voitures = new ArrayList<Vehicule>();
    			
    				try {
    					ois = new ObjectInputStream(
    							new FileInputStream(
    								new File("file.txt")));
    					
    					try {
    						while (ois.available() >0)
    						voitures.add((Vehicule)ois.readObject());
    					} catch (ClassNotFoundException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    						voitures.add(voit);
    					
    					ois.close();
    						
    					oos = new ObjectOutputStream(
    							new FileOutputStream(
    								new File("file.txt")));
    					
    					for (Vehicule v : voitures)
    						oos.writeObject(v);
    
    					oos.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			
    		}
    		
    		public String toString() {
    			String str = 	"************************\n" +
    							"*   GARAGE OPENCROOM   *\n" +
    							"************************\n\n";
    			FileInputStream fis = null;
    			ObjectInputStream ois = null;
    			
    			try {
    				fis = new FileInputStream("file.txt");
    				ois = new ObjectInputStream(fis);
    				
    				while(fis.available() > 0)
    					str += ois.readObject();
    					
    				fis.close();
    				ois.close();
    			} catch (IOException | ClassNotFoundException e) {
    				System.err.println("Aucune voiture sauvegardée");
    			}
    			
    			return str;
    		}
    }

    merci d'avance de votre aide

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      11 avril 2017 à 10:56:25

      Bonjour,

      Tu créé un nouveau fichier à chaque fois, sans prendre ce qu'il y a écrit dans le précédent ;)

      • Partager sur Facebook
      • Partager sur Twitter
        13 avril 2017 à 15:08:48

        Bonjour et merci de ta réponse.

        Je ne comprends pas ce que je fais mal, J'ai l'impression de faire ceci :

        - j'ouvre mon fichier dans lequel il y a toutes les voitures précédemment sauvegardées (lignes 25 à 29)

        - je mets dans une ArrayList toutes ces voitures (lignes 30 à 36)

        - j'ajoute la nouvelle voiture à cette liste (ligne 37)

        - je réécris toutes les voitures de la ArrayList dans le fichier (lignes 45-46)

        ... Ca m'a l'air plutôt classe, mais manifestement eclipse n'est pas d'accord avec moi... Je dois donc passer à côté d'un truc, mais je comprends pas quoi !

        • Partager sur Facebook
        • Partager sur Twitter
          14 avril 2017 à 21:01:11

          Bonjour,

          Au lieu de sauvegarder les voitures une à une, essaye plutôt de sauvegarder la liste.

          • Partager sur Facebook
          • Partager sur Twitter
            15 avril 2017 à 0:01:53

            Bon, sérieusement je comprends rien...

            Déà, brubru777, merci de ton aide... même si au final j'ai rien bité...enfin pour être exact, j'ai essayé de mettre

            oos.writeObject(v);

            au lieu de

             for (Vehicule v : voitures)
               oos.writeObject(v);

            (c'est bien ce que tu me disais de faire?)

            mais ça n'a pas marché... Et en même temps je comprends pas pourquoi je pourrais pas les mettre un par un? pour cet exercice, je te l'accorde, ça n'importe pas, mais si je veux faire un fichier avec pas mal d'objets dedans et pas une liste, ça doit bien être faisable?

            Alors j'ai mis un peu partout des println pour voir ce qui se passait réellement, et il se trouve que mon ArrayList "voit" a bien toutes les voitures; par contre c'est la sérialisation qui fait... rien ! Même pas le café ! Mais comme quand je me relis ça a l'air logique, je me dis que soit je rate un truc, soit en fait c'est mon workspace qui fout la merde (pour tout dire j'essaie vainement de le mettre sur dropbox vu que j'oscille entre 2 PCs, mais ça n'a pas l'air d'être l'idée du siècle...)

            Mon code un peu modifié mais qui ne change rien :

            public class Garage implements Serializable{
            	
            		private ArrayList<Vehicule> voiture;
            		 
            		public Garage() {
            		}
            		
            		public void addVoiture(Vehicule voit) {
            			ObjectInputStream ois = null;
            			ObjectOutputStream oos = null;
            			voiture = new ArrayList<Vehicule>();
            			
            				try {
            					oos = new ObjectOutputStream(
            							new FileOutputStream(
            								new File("file.txt")));
            					
            					ois = new ObjectInputStream(
            							new FileInputStream("file.txt"));
            					
            					while (ois.available() > 0)
            					voiture.add((Vehicule) ois.readObject());
            					voiture.add(voit);
            					
            					ois.close();
            					
            							oos.writeObject(voiture);
            							System.out.println(voiture);
            							// voiture a bien toutes les instances...
            
            					oos.close();
            				} catch (IOException | ClassNotFoundException e) {
            					// TODO Auto-generated catch block
            					e.printStackTrace();
            				}
            			
            		}
            		
            		public String toString() {
            			String str = 	"\n************************\n" +
            							  "*   GARAGE OPENCROOM   *\n" +
            						      "************************\n\n";
            			FileInputStream fis = null;
            			ObjectInputStream ois = null;
            			
            			try {
            				fis = new FileInputStream("file.txt");
            				ois = new ObjectInputStream(fis);
            				
            				if (ois.available() == 0)
            				System.out.println("C'est NUL!!");
            				
            				else str += ois.readObject().toString();
            				
            		// retourne "C'est NUL!!"...
            				
            				fis.close();
            				ois.close();
            			} catch (IOException | ClassNotFoundException e) {
            				System.err.println("Aucune voiture sauvegardée");
            			}
            			
            			return str;
            		}
            }

            Merci pour l'aide en tout cas!

            • Partager sur Facebook
            • Partager sur Twitter
              17 avril 2017 à 14:52:55

              Up,

              pour être exact, j'aimerais savoir ce qui ne va pas dans mon code pour enregistrer les voitures une par une, et pourquoi dans mon 2è code la liste existe (puisque quand je la print elle s'écrit bien) mais ne s'écrit pas dans le fichier...

              Merci :)

              • Partager sur Facebook
              • Partager sur Twitter
                19 avril 2017 à 11:45:51

                Salut ! D'après le diagramme , l'arraylist doit plutôt etre une variable de la classe Garage ( normal). Ce que tu dois faire c'est que dès qu'on instancie la classe Garage, celle-ci va chercher la liste de voiture déjà inscrite dans le fichier et les ajoute dans la variable voiture (ArrayList). Puis dans un second temps dans ta méthode add tout devient évident ! Dès lors qu'on veut ajouté une voiture , tu doit d'abord l'ajouter à l'arrayList puis faire un parcours et ajouté chaque objet à son tour.

                Code on !

                -
                Edité par sdmg15 19 avril 2017 à 11:46:07

                • Partager sur Facebook
                • Partager sur Twitter
                La justice est la plus pire des injustices.
                  20 avril 2017 à 1:08:32

                  Salut et merci de ta réponse.

                  En effet, pour le ArrayList, j'avais zappé qu'il s'agissait d'une variable de classe... ça change un peu les choses! merci de la remarque.

                  et sinon pour mon code en retournant le truc je me suis rendu compte que ce qui foutait la merde, c'était le fait d'ouvrir un FileOutputStream, puis juste après un FileInputStream sur le même fichier. En regardant sur le site d'oracle, j'ai compris le truc : créer un FileOutputStream vide le fichier; j'ouvrais donc toujours un FileInputStream vide, du coup ca expliquait l'erreur :p

                  Merci à tous de votre aide, sujet résolu :)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  exercice garage (bis)

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown