Flots et Srialisation des objets - PowerPoint PPT Presentation

Loading...

PPT – Flots et Srialisation des objets PowerPoint presentation | free to download - id: 29cfe1-M2JiN



Loading


The Adobe Flash plugin is needed to view this content

Get the plugin now

View by Category
About This Presentation
Title:

Flots et Srialisation des objets

Description:

Un objet capable de transf rer une suite d'octets. soit d'une source externe vers le ... Un objet capable de transf rer une suite d'octets. soit d'une source ... – PowerPoint PPT presentation

Number of Views:54
Avg rating:3.0/5.0
Slides: 38
Provided by: mugn4
Learn more at: http://www.lirmm.fr
Category:

less

Write a Comment
User Comments (0)
Transcript and Presenter's Notes

Title: Flots et Srialisation des objets


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

Flot d'entrée (ou de lecture)
  • soit du programme vers une cible externe

Flot de sortie (ou décriture)
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

Flot d'entrée (ou de lecture)
  • soit du programme vers une cible externe

Flot de sortie (ou décriture)
4
La jungle des flots (? 60 classes en java 2)
Package java.io aussi java.util.zip ()
  • Flots binaires

Information transmise telle quelleoctet par octet
  • Flots de texte

Information subit une transformation("formatage")
pour passer du codage UNICODEutilisé en java au
format texte de la machine hôteet inversement
5
Exemple écrire des caractères dans un fichier
  • par un flot binaire

Car UNICODEsur 2 octets
  • par un flot de texte

Car UNICODEsur 2 octets
Le fichier obtenu est lisible par un éditeur de
texte
6
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
7
Flots binaires utilisés
OutputStream
abstraites
InputStream
Manipulent des octets
DataOutputStream
DataInputStream
Lire et écrire des types primitifs String
FileOutputStream
FileInputStream
Permettent d'associer un flot binaire à un
fichiermais ne possèdent que des méthodes (de
lecture ou décriture) de bas niveau
8
On "branche" donc des flots sur des flots
Exemple écrire dans un fichier
programme
fichier
DataOuptutStream
FileOutputStream
int,float,char, String
DataOutputStream fs new DataOuputStream (new
FileOuputStream(test.bb"))fs.writeChars(la
chaine a ecrire)fs.close()
9
Flots de texte
Writer
Reader
abstraites
Manipulent des caractères(UNICODE?? format hôte)
InputStreamWriter
InputStreamReader
FileReader
FileWriter
Permettent d'associer un flot de texte à un
fichier
10
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
11
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()
12
Exemple lire un fichier texte et lafficher
(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 na qu'un RC la
valeur null s'il n'y a rien à lire / while
(s! null) System.out.println(s)//affich
age console s ff.readLine() ff.close()
13
Exemple créer un fichier texte par lecture au
clavier
BufferedReader fc new BufferedReader
(new InputStreamReader (System.in)) BufferedWrit
er 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.clos
e()
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 o1 dune classe C1
Objet odune classe C
Objet o2 dune classe C2
int i
17
Exemple Minidraw (éditeur graphique)
Les classes
Fenêtre fenêtre principalePanneau panneau
CollectionFigures collection de
figures qui encapsule un ArrayList ArrayListltF
iguregt encapsule un tableau de figuresFigure
classe racine des figuresRect
une sorte de figureRectPlein dautres
sortes de figuresOvale
OvalePlein
sauver la collectionde Figures
Sauver un dessin ?
18
Graphe de décomposition de la collection de
figures
monDessinCollectionFigures
tabArrayListltFiguregt
compteur int
TFigure
Rect
x int y int
Ovale
RectPlein
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 ?
monDessinCollectionFigures
tabArrayListltFiguregt
compteur int
TFigure
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
21
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) 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
22
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, )

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 ?
monDessinCollectionFigures
tabArrayListltFiguregt
compteur int
TFigure
Rect
x int y int
Ovale
RectPlein
CollectionFigures ArrayList (cest le cas)
Figure
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
Rappel la sélection dune entrée de menu se
gère comme une action sur bouton
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
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
Classe Panneau
public void sauveDessin (File Fic)
ObjectOutputStream flotS new
ObjectOutputStream (new FileOutputStream
(Fic)) flotS.writeObject(monDessin)
flotS.close()
throws IOException
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)
29
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 linterface
ActionListener nela pas prévu et quune
redéfinition de méthodene peut ajouter des
exceptions)
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)
Classe Panneau
public void restaureDessin (File Fic)
ObjectInputStream flotE new
ObjectInputStream (new FileInputStream (Fic))
Utiliser flotE.readObject() pour recréer
lobjet monDessin
32
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 lappel de paintComponent repaint()
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é
FENETRE
Entrée de menu Sauver 
Écouteur.actionPerformed()
sauve()
Choix Ficpanneau.sauveDessin(Fic)
PANNEAU
sauveDessin(Fic)
writeObject(monDessin)
Suite dappels similaire pour  Restaurer 
35
Choisir un fichier
Indiquer le parent de la boîteou 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.showOpenDialo
g/ affiche une boîte de dialogue permettant de
choisir un fichier existant /
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
  • nautoriser la sauvegarde quen 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 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

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 ?
About PowerShow.com