La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Flots et Sérialisation des objets. Qu'est-ce qu'un flot? Stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme.

Présentations similaires


Présentation au sujet: "Flots et Sérialisation des objets. Qu'est-ce qu'un flot? Stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme."— Transcription de la présentation:

1 Flots et Sérialisation des objets

2 Qu'est-ce qu'un flot? Stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme soit du programme vers une cible externe Flot d'entrée (ou de lecture) Flot de sortie (ou décriture) sourceprogramme clavier, fichier, réseau... cible programme écran, fichier, réseau, imprimante...

3 Qu'est-ce qu'un flot? Stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme soit du programme vers une cible externe Flot d'entrée (ou de lecture) Flot de sortie (ou décriture) sourceprogramme clavier, fichier, réseau... cible programme écran, fichier, réseau, imprimante...

4 La jungle des flots ( 60 classes en java 2) Flots binaires Package java.io aussi java.util.zip (…) Information transmise telle quelle octet par octet Flots de texte Information subit une transformation ("formatage") pour passer du codage UNICODE utilisé en java au format texte de la machine hôte et inversement

5 par un flot binaire Exemple : écrire des caractères dans un fichier par un flot de texte Flot de sortie programme fichier Car UNICODE sur 2 octets ces 2 octets Car UNICODE sur 2 octets Car code local sur 1 octet cet octet '\n' Car LF UNIX Car CR et LF MS-DOS Le fichier obtenu est lisible par un éditeur de texte

6 Flots binaires InputStream OutputStream Manipulent des octets ou tableaux d'octets Attention, entêtes des méthodes trompeuses Par exemple, dans InputStream : public abstract int read() throws IOException lit un seul octet stocké dans un int (0..255) ou -1 si rien lu

7 Flots binaires utilisés InputStream OutputStream Manipulent des octets DataInputStream DataOutputStream Lire et écrire des types primitifs + String FileInputStream Permettent d'associer un flot binaire à un fichier mais ne possèdent que des méthodes (de lecture ou décriture) de bas niveau FileOutputStream abstraites

8 On "branche" donc des flots sur des flots Exemple : écrire dans un fichier DataOuptut Stream programme fichier int, float, char,… String FileOutput Stream DataOutputStream fs = new DataOuputStream (new FileOuputStream(test.bb")); fs.writeChars(la chaine a ecrire); ……… fs.close();

9 Flots de texte Reader Writer Manipulent des caractères (UNICODE format hôte) abstraites InputStreamReader InputStreamWriter FileReader Permettent d'associer un flot de texte à un fichier FileWriter

10 En pratique on utilise Pour lire : BufferedReaderméthode readLine() Pour écrire : BufferedWriterméthodes write (String) newLine() PrintWriterméthodes print println pour écrire tous les types primitifs + String Qu'on branche sur des flots de plus bas niveau

11 BufferedReader fc = new BufferedReader (new InputStreamReader(System.in)); String chaineLue = fc.readline(); int i = Integer.parseInt(chaineLue); Depuis la version 5, on a aussi la classe Scanner : Scanner sc = new Scanner(System.in); int i = sc.nextInt(); Exemple : lire un entier tapé au clavier

12 BufferedReader ff = new BufferedReader (new FileReader ("essai.txt")); // Lecture du fichier " essai.txt" String s = ff.readLine(); /* readLine() retourne : la ligne lue jusqu'au retour chariot (lu mais non retourné) donc une chaîne vide si la ligne na qu'un RC la valeur null s'il n'y a rien à lire */ while (s!= null) { System.out.println(s); //affichage console s = ff.readLine(); } ff.close(); Exemple : lire un fichier texte et lafficher (console)

13 BufferedReader fc = new BufferedReader (new InputStreamReader (System.in)); BufferedWriter ff = new BufferedWriter (new FileWriter ("essai.txt")); System.out.println("Entrez des lignes (Return pour terminer)"); String s = fc.readLine(); while (s.length() != 0) { ff.write(s); // TQ pas chaîne vide ff.newLine(); s = fc.readLine(); } ff.close(); Exemple : créer un fichier texte par lecture au clavier

14 Et les objets? Les flots que nous venons de voir permettent de manipuler des : variables ou valeurs de type primitif tableaux de caractères chaînes de caractères (String) Les Objets autres que des String?

15 Lecture/écriture dobjets Méthode « artisanale » Ecriture : décomposer lobjet à sauvegarder jusquà obtenir des données de type primitif ou des String Lecture : reconstruire un objet (de la bonne classe !) à partir des données de type primitif ou des String lues Méthode automatique : sérialisation (Attention : sauvegarde au format binaire uniquement)

16 Principe : décomposition dun objet jusquà arriver à des données de type primitif ou String Objet o dune classe C Objet o1 dune classe C1 Objet o2 dune classe C2 int i Quelque part, un objet flot a été créé sauver(flot) { o1.sauver(flot) o2.sauver(flot) flot.écrire(i)} Classe C

17 Exemple : Minidraw (éditeur graphique) Fenêtre fenêtre principale Panneaupanneau CollectionFigures collection de figures qui encapsule un ArrayList ArrayList encapsule un tableau de figures Figureclasse racine des figures Rect une sorte de figure RectPlein dautres sortes de figures Ovale … OvalePlein … Les classes Sauver un dessin ? = sauver la collection de Figures

18 Graphe de décomposition de la collection de figures monDessin CollectionFigures tab ArrayList T Figure[] Rect Ovale RectPlein compteur int x int y int ………… On décompose lobjet jusquà arriver à des données de type primitif ou des String

19 Le graphe de décomposition peut être plus complexe qu'une arborescence Pourquoi on dit « sérialisation »

20 Que faudrait-il sauvegarder pour pouvoir reconstituer le dessin ? compteur "Rect" x y Lh Lv colTrait "Oval" x y Lh Lv colTrait "RectPlein" x y Lh Lv colTrait colFond monDessin CollectionFigures tab ArrayList T Figure[] Rect Ovale RectPlein compteur int x int y int …………

21 Où seraient implémentées les méthodes ? - Quelque part, créer un flot associé à un fichier Méthode sauve(flot) dans CollectionFigures - écrire le nombre de figures (compteur) - appeler une méthode « sauve » pour chaque figure Méthode sauve(flot) dune classe de figure : - écrit le « type » - écrit les attributs définis dans cette classe - appelle la méthode super.sauve(flot) pour les attributs dont elle hérite compteur "Rect" x y Lh Lv colTrait "Oval" x y Lh Lv colTrait "RectPlein" x y Lh Lv colTrait colFond

22 – Sérialisation – Méthode "automatique" public final void writeObject(Object obj) throws IOException Classe java.io.ObjectOutputStream public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException Classe java.io.ObjectInputStream Ces classes permettent aussi de manipuler des types primitifs (méthodes writeInt, readInt, …) Les tableaux sont des objets

23 Ces méthodes ne s'appliquent qu'à des objets sérialisables = dont la classe implémente l'interface java.io.Serializable (interface "marqueur") La propriété dêtre sérialisable s'hérite : si une classe implémente une interface, ses sous-classes aussi Prenons le graphe de décomposition de l'objet : tous les objets du graphe doivent être sérialisables (sinon NotSerializableException)

24 Quelles classes doivent implémenter linterface Serializable ? CollectionFigures ArrayList (cest le cas) Figure monDessin CollectionFigures tab ArrayList T Figure[] Rect Ovale RectPlein compteur int x int y int …………

25 Exemple de la sauvegarde et de la restauration dune collection de figures en détails

26 La barre de menu est ajoutée à la fenêtre JMenuBar Jmenu JMenuItem A lentrée de menu sauver on associe un écouteur dune classe anonyme, dont la méthode actionPerformed appelle la méthode sauve() de la fenêtre Rappel : la sélection dune entrée de menu se gère comme une action sur bouton Même principe pour restaurer méthode restaure() de la fenêtre

27 Méthode sauve() de la fenêtre - choix d'un nom de fichier Fic (par boîte de dialogue) - demande à panneau de sauver le dessin dans le fichier de nom Fic panneau.sauveDessin(Fic); Méthode restaure() de la fenêtre - choix d'un nom de fichier Fic (par boîte de dialogue) - demande à panneau de restaurer le dessin depuis le fichier de nomFic panneau.restaureDessin(Fic);

28 public void sauveDessin (File Fic) { ObjectOutputStream flotS = new ObjectOutputStream (new FileOutputStream (Fic)); flotS.writeObject(monDessin); flotS.close(); } Classe Panneau Gère des infos sur un fichier Que faire de lexception (IOException) susceptible dêtre générée par writeObject ? On la retransmet à la méthode appelante (donc méthode sauve de la fenêtre) throws IOException

29 Revenons à la classe Fenêtre : public void sauve() {……………… panneau.sauveDessin(Fic); } Problème : throws IOException de sauveDessin De toutes façons, actionPerformed ne peut pas déclarer throws IOException (car linterface ActionListener ne la pas prévu et quune redéfinition de méthode ne peut ajouter des exceptions) La méthode sauve ne peut ignorer cette exception : - la retransmet à la méthode appelante (actionPerformed) - ou la capture et la traite

30 Donc on capture et traite lexception si elle survient : public void sauve() {……………… try // surveiller ce bloc dinstructions { panneau.sauveDessin(Fic); } catch (IOException e) // capturer lexception si elle survient { // traiter le problème JOptionPane.showMessageDialog (null, Erreur de sauvegarde); } }

31 Implémentons maintenant la méthode restaure() de la fenêtre - choix d'un nom de fichier Fic (par boîte de dialogue) - demande à panneau de restaurer le dessin depuis le fichier de nomFic panneau.restaureDessin(Fic); public void restaureDessin (File Fic) { ObjectInputStream flotE = new ObjectInputStream (new FileInputStream (Fic)); Utiliser flotE.readObject() pour recréer lobjet monDessin } Classe Panneau

32 public void restaureDessin (File Fic) throws IOException,ClassNotFoundException { ObjectInputStream flotE = new ObjectInputStream (new FileInputStream (Fic)); Object o = FlotE.readObject(); monDessin = (CollectionFigures) o; flotE.close(); // demander lappel de paintComponent repaint(); } Classe Panneau

33 Dans la classe Fenêtre, il faut traiter les exceptions pouvant être générées par restaureDessin: public void restaure() {……………… panneau.restaureDessin(Fic); } {……………… try // surveiller ce bloc dinstructions { panneau. restaureDessin(Fic); } catch (Exception e) // capturer tout type dexception !! { // on fait le service minimum JOptionPane.showMessageDialog (null, Erreur de restauration); } }

34 Résumé Entrée de menu « Sauver » Écouteur.actionPerformed(…) sauve() Choix Fic panneau.sauveDessin(Fic) sauveDessin(Fic) writeObject(monDessin) PANNEAU FENETRE Suite dappels similaire pour « Restaurer »

35 Choisir un fichier File Fic = null; JFileChooser chooser = new JFileChooser(); int rep = chooser.showSaveDialog(this); /* affiche une boîte de dialogue permettant de choisir un fichier existant ou nouveau */ if (rep == JFileChooser.APPROVE_OPTION) Fic = chooser.getSelectedFile(); Pour la sauvegarde Pour la restauration : chooser.showOpenDialog /* affiche une boîte de dialogue permettant de choisir un fichier existant */ Indiquer le parent de la boîte ou null

36 Conclusion sur la sérialisation Avantages Automatique Permet de gérer facilement des objets complexes Inconvénient Flots binaires : fichiers pas lisibles [Suite : application au TP Same]

37 Quels fichiers dans le TP « Same » ? Sauvegarde et restauration dune configuration initiale - que sauvegarder ? La matrice de pions ? mécanisme de sérialisation Une matrice de couleurs (ou dentiers) ? méthode « artisanale » Juste le « seed » (pour générer la même série dentiers) sauvegarder un entier (de type long) utiliser System.currentTimeMillis() pour générer un seed - nautoriser la sauvegarde quen début de partie voir dans JMenuItem : public void setEnabled(boolean b)

38 Sauvegarde et affichage des x meilleurs scores - on gère des couples (nom, score) sans doute commode de créer une classe ScoreItem et de gérer un tableau de ScoreItem - fichier binaire plutôt que texte ? (éviterait une modification sauvage des scores) le mécanisme de sérialisation est alors utilisable - à la fin dune partie, mise à jour éventuelle du fichier des scores - afficher en permanence les x meilleurs scores ?


Télécharger ppt "Flots et Sérialisation des objets. Qu'est-ce qu'un flot? Stream Un objet capable de transférer une suite d'octets soit d'une source externe vers le programme."

Présentations similaires


Annonces Google