Flots et Sérialisation des objets

Slides:



Advertisements
Présentations similaires
Sérialisation des objets
Advertisements

Le mécanisme des exceptions
Introspection et Réflexion Manipulation dynamique de code Java.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Au programme du jour …. Un peu plus de structures de données
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Approfondissement du langage
(Classes prédéfinies – API Java)
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
Programmer en JAVA par Tama
JAV - TD 6 Structures de données JAVA
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
FLSI602 Génie Informatique et Réseaux
1 Le mécanisme des exceptions Qu'est-ce qu'une exception? Comment définir et signaler des exceptions? Comment récupérer des exceptions?
Traitement des erreurs en Java
Principes de programmation (suite)
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
COURS DE PROGRAMMATION ORIENTEE OBJET :
Récursivité.
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Cours d ’Informatique, DEUG 2 MASS/MIASS
Les exceptions. Quest ce quune exception ? Une erreur dans le programme Due à un bug ou un cas « anormal » Gestion complète en java : JVM Dans dautre.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Système d’Exploitation
Introduction à la programmation (Java)
Les fichiers binaires en C++
FICHIERS : Définition : Algorithme général:
Introduction à la programmation objet Langage Java
Présentation Structures de Données et TDA
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
IFT 6800 Atelier en Technologies d’information
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Cours 8 (18 novembre 2011) exceptions. héritagePOO-L3 H. Fauconnier2 Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y(); xA[1]=new X();
COURS DE PROGRAMMATION ORIENTEE OBJET :
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
1212 Entrée et sortie de fichiers Objectifs À la fin de ce cours, vous serez capables de : • Lire à partir de la console • Écrire sur la console.
J201 (JOC) Java Avancé juin 2007 ~ Brigitte Groléas ~
1 Fichers Binaires, Accès Direct et Objets. 2 Données binaires. Il s'agit ici de lire et écrire des données binaires par opposition à du texte. Pour ce.
Java : Exceptions H Batatia. 5/03/2004Java12: H.Batatia2 Exemple 1 public class Bonjour { public static void main(String[] args) { System.out.println("Bonjour.
Cours 7 Classes locales Clonage Divers: tableaux.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 6 – Exceptions.
Cours Les flux ou streams. Cours 162 Flux : objet possédant des méthodes capables de lire ou écrire des flots d’octets sur tout support (mémoire,
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Interfaces graphiques. Composants d'interface utilisateur graphique (GUI) 1 Bibliothèques Awt et Swing Procédures communes pour l'utilisation de ces clases.
14 La gestion d’événements
Tutorat en bio-informatique
Entrées / Sorties.
Strings et Tableaux en Java
Les sockets.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Cours du 5 novembre.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
Les variables fichiers. Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
1 Chapitre III (~70 transparents) Compléments. 2 Au sommaire de ce chapitre 1. Les fichiers Les classes utilitaires
Ingénierie des réseaux - Chapitre 2 bis Les sockets en Java
6ième Classe (Mercredi, 17 novembre) CSI2572
Fichier et Stream d’Entrée-Sortie IFT1025, Programmation 2 Jian-Yun Nie Version court par Douglas Eck; Version
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java

Classes abstraites, interface Classe interne Classes enveloppes
JAVA Les Entrées-sorties
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
STREAMS (et fichiers).
Lecture/Écriture de fichiers (I/O)
Transcription de la présentation:

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 source programme clavier, fichier, réseau ... Flot d'entrée (ou de lecture) soit du programme vers une cible externe En Java les entrées/sorties se gèrent par des flots. Ou Stream en anglais. Concept emprunté à C++. Qu’est-ce qu’un flot ? cible programme écran, fichier, réseau, imprimante ... Flot de sortie (ou d’écriture)

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 source programme clavier, fichier, réseau ... Flot d'entrée (ou de lecture) soit du programme vers une cible externe En Java les entrées/sorties se gèrent par des flots. Ou Stream en anglais. Concept emprunté à C++. Qu’est-ce qu’un flot ? cible programme écran, fichier, réseau, imprimante ... Flot de sortie (ou d’écriture)

La jungle des flots ( 60 classes en java 2) Package java.io aussi java.util.zip (…) Flots binaires 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

Exemple : écrire des caractères dans un fichier Flot de sortie programme fichier par un flot binaire Car UNICODE sur 2 octets ces 2 octets par un flot de texte 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

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

Flots binaires utilisés InputStream OutputStream abstraites Manipulent des octets DataInputStream DataOutputStream Lire et écrire des types primitifs + String FileOutputStream 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

On "branche" donc des flots sur des flots Exemple : écrire dans un fichier programme fichier DataOuptut Stream FileOutput Stream int, float, char,… String DataOutputStream fs = new DataOuputStream (new FileOuputStream(“test.bb")); fs.writeChars(“la chaine a ecrire”); ……… fs.close(); Close() : casse l’association entre l’objet flot fs et le fichier « test.bb » et libère toutes les ressources systèmes qui étaient utilisées par l’écriture dans le fichier.

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

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

Exemple : lire un entier tapé au clavier 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 fichier texte et l’afficher (console) 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 n’a 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 : créer un fichier texte par lecture au clavier 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();

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?

Lecture/écriture d’objets Méthode « artisanale » Ecriture : décomposer l’objet à 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)

Principe : décomposition d’un objet jusqu’à arriver à des données de type primitif ou String Objet o1 d’une classe C1 Objet o d’une classe C Objet o2 d’une 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

Exemple : Minidraw (éditeur graphique) Les classes Fenêtre fenêtre principale Panneau panneau CollectionFigures collection de figures qui encapsule un ArrayList ArrayList<Figure> encapsule un tableau de figures Figure classe racine des figures Rect une sorte de figure RectPlein d’autres sortes de figures Ovale … OvalePlein … = sauver la collection de Figures Sauver un dessin ?

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

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

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

Où seraient implémentées les méthodes ? compteur "Rect" x y Lh Lv colTrait "Oval" x y Lh Lv colTrait "RectPlein" x y Lh Lv colTrait colFond 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) d’une 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

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

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)

Quelles classes doivent implémenter l’interface Serializable ? monDessin CollectionFigures tab ArrayList<Figure> compteur int T Figure[] Rect x int y int ………… Ovale RectPlein CollectionFigures ArrayList (c’est le cas) Figure

Exemple de la sauvegarde et de la restauration d’une collection de figures en détails

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

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);

public void sauveDessin (File Fic) { Classe Panneau Gère des infos sur un fichier public void sauveDessin (File Fic) { ObjectOutputStream flotS = new ObjectOutputStream (new FileOutputStream (Fic)); flotS.writeObject(monDessin); flotS.close(); } throws IOException Que faire de l’exception (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)

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

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

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); Classe Panneau public void restaureDessin (File Fic) { ObjectInputStream flotE = new ObjectInputStream (new FileInputStream (Fic)); Utiliser flotE.readObject() pour recréer l’objet monDessin }

Classe Panneau 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 l’appel de paintComponent repaint(); }

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 d’instructions { panneau. restaureDessin(Fic); } catch (Exception e) // capturer tout type d’exception !! { // on fait le service minimum JOptionPane.showMessageDialog (null, “Erreur de restauration”); } }

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

Choisir un fichier Pour la sauvegarde File Fic = null; Indiquer le parent de la boîte ou null Pour la sauvegarde 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 restauration : chooser.showOpenDialog /* affiche une boîte de dialogue permettant de choisir un fichier existant */

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]

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

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 d’une partie, mise à jour éventuelle du fichier des scores afficher en permanence les x meilleurs scores ?