COURS DE PROGRAMMATION ORIENTEE OBJET :

Slides:



Advertisements
Présentations similaires
LES NOMBRES PREMIERS ET COMPOSÉS
Advertisements

Qualité du Premier Billot. 2 3 Défauts reliés à labattage.
Distance inter-locuteur
Sérialisation des objets
Le mécanisme des exceptions
Flots et Sérialisation des objets
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
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.
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
(Classes prédéfinies – API Java)
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
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
Algorithme et structure de données
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
La diapo suivante pour faire des algorithmes (colorier les ampoules …à varier pour éviter le « copiage ») et dénombrer (Entoure dans la bande numérique.
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage 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?
User management pour les entreprises et les organisations Auteur / section: Gestion des accès.
Mr: Lamloum Med LES NOMBRES PREMIERS ET COMPOSÉS Mr: Lamloum Med.
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
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.
Langage Oriente Objet Cours 4.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Principes de programmation (suite)
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Système d’Exploitation
Introduction à la programmation (Java)
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
LES NOMBRES PREMIERS ET COMPOSÉS
Langage Oriente Objet Cours 2.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Programmation Orienté Objet applications au langage Java
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
POO-L3 H. Fauconnier1 Supplément gratuit…. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double.
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
COURS DE PROGRAMMATION ORIENTEE OBJET :
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.
Équipe 2626 Octobre 2011 Jean Lavoie ing. M.Sc.A.
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.
Structures des données
Traitement de différentes préoccupations Le 28 octobre et 4 novembre 2010.
J201 (JOC) Java Avancé juin 2007 ~ Brigitte Groléas ~
4 Introduction des objets. Les chaînes et tableaux
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.
LES PILES ET FILES.
Cours n°3 rappels. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double a = 5.6d ; double b =
Les Chiffres Prêts?
11/04/ L'héritage Cours 7 Cours 7.
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.
Tutorat en bio-informatique
Entrées / Sorties.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 3 – Classes et objets en Java Master 1 SIGLIS1 Java Lecteur - Chapitre 3 Classes et objets 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.
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
Fichier et Stream d’Entrée-Sortie IFT1025, Programmation 2 Jian-Yun Nie Version court par Douglas Eck; Version
LES CLASSES ET LES OBJETS
Lecture/Écriture de fichiers (I/O)
Transcription de la présentation:

COURS DE PROGRAMMATION ORIENTEE OBJET : Flux et Fichiers

Les données sont fournies au programme via un flux d’entrée. FLUX ET FICHIERS Flux et fichiers Les entrées et les sorties sont gérées par les objets de flux : Les données sont fournies au programme via un flux d’entrée. Les données ressortent via un flux de sortie.

Les classes d’entrées/sorties FLUX ET FICHIERS Les classes d’entrées/sorties Elles sont définies dans le paquetage java.io. Entrée Sortie Binaire InputStream OutputStream Texte Reader Writer

Les classes d’entrées/sorties FLUX ET FICHIERS Les classes d’entrées/sorties InputStream et OutputStream permettent de traiter les fichiers binaires. Les fichiers binaires sont des fichiers image, vidéo, audio et exécutables. Java les transfère en octets de 8 bits.

Les classes d’entrées/sorties FLUX ET FICHIERS Les classes d’entrées/sorties Reader et Writer permettent de traiter les fichiers texte. Les fichiers texte sont lus et écrits par des éditeurs de texte. Java les transfère sous forme de codes Unicode de deux octets.

InputStream et ses sous-classes FLUX ET FICHIERS InputStream et ses sous-classes La classe InputStream possède une seule méthode abstraite : abstract int read() throws IOException qui lit un seul octet et renvoie cet octet ou bien -1 si la fin de la source de données a été atteinte. Chaque sous-classe concrète devra surcharger cette méthode. Exemple : pour la sous-classe FileInputStream, la méthode read lit un seul octet dans un fichier.

InputStream et ses sous-classes FLUX ET FICHIERS InputStream et ses sous-classes L’objet prédéfini System.in de type InputStream permet de saisir l’information à partir du clavier Après une opération de lecture dans un flux, il faut le fermer en appelant la méthode close qui libère les ressources.

InputStream et ses sous-classes FLUX ET FICHIERS InputStream et ses sous-classes Exemples de sous-classes : AudioInputStream : lecture de données audio. DataInputStream : lecture des types primitifs de Java. FileInputStream : lecture dans un fichier sur disque. ZipInputStream : lecture de fichiers dans le format de compression ZIP.

InputStream et ses sous-classes FLUX ET FICHIERS InputStream et ses sous-classes Combinaison de flux FileInputStream permet d’accéder aux données d’un fichier mais ne possède pas de méthode pour lire les types numériques. DataInputStream ne fournit pas de méthode pour accéder aux données d’un fichier mais possède des méthodes qui assemblent les octets en types de données numériques.

InputStream et ses sous-classes FLUX ET FICHIERS InputStream et ses sous-classes Combinaison de flux Pour lire des nombres dans un fichier : On crée un objet FileInputStream en appelant le constructeur : public FileInputStream(String name) throws FileNotFoundException On passe cet objet au constructeur d’un objet DataInputStream La classe DataInputStream fournit par exemple la méthode : public final double readDouble() throws IOException

InputStream et ses sous-classes FLUX ET FICHIERS InputStream et ses sous-classes Combinaison de flux Pour lire des nombres dans un fichier : FileInputStream f = new FileInputStream("test.txt"); DataInputStream d = new DataInputStream(f); double s = d.readDouble();

FLUX ET FICHIERS OutputStream et ses sous-classes La classe OuputStream possède une seule méthode abstraite abstract void write(int b) qui écrit un octet vers une destination. Exemples de sous-classes: AudioOutputStream, DataOutputStream, FileOutputStream, ZipOutputStream. Deux autres méthodes: void close() qui vide le tampon de sortie et ferme le flux. void flush() qui envoie vers la cible les données se trouvant sur le tampon. Permet de forcer le vidage du tampon de sortie.

OutputStream et ses sous-classes FLUX ET FICHIERS OutputStream et ses sous-classes DataOutputStream Fournit les méthodes pour écrire des données binaires de tous les types de base de Java : writeChars qui écrit un caractère Unicode sur 2 octets writeInt qui écrit toujours un entier sur 4 octets writeDouble qui écrit toujours un double sur 8 octets Les sorties binaires produites par ces méthodes ne seront pas lisibles en utilisant les outils du système d’exploitation mais pourront être lues par un programme Java avec les méthodes correspondantes de la classe DataInputStream.

Avantages et inconvénients des fichiers binaires FLUX ET FICHIERS Avantages et inconvénients des fichiers binaires Avantages compacts efficaces Indépendants des plates-formes Inconvénients Les sorties binaires ne sont pas directement lisibles par l’homme.

Java utilise le codage de caractères Unicode. FLUX ET FICHIERS Les flux de texte Codage de caractères : Java utilise le codage de caractères Unicode. Chaque système d’exploitation utilise son propre système de codage de caractères.

Java va fournir des classes permettant FLUX ET FICHIERS Les flux de texte Codage de caractères : Java va fournir des classes permettant d’obtenir des caractères Unicode à partir d’un flux d’entrée contenant des octets dans un codage particulier de type caractères (InputStreamReader). D’obtenir un flux d’octets dans un codage particulier de type caractères à partir d’un flux de caractères Unicode (OutputStreamReader).

Les classes Reader et Writer FLUX ET FICHIERS Les classes Reader et Writer Les méthodes de base des classes Reader et Writer sont comparables à celles de InputStream et de OutputStream : abstract int read() throws IOException renvoie soit une unité de code Unicode (sous forme d’un entier entre 0 et 65535) soit -1 si la fin du fichier est atteinte. abstract void write (int b)

Les classes Reader et Writer FLUX ET FICHIERS Les classes Reader et Writer Lecture de texte à partir d’un fichier : FileReader Permet de lire à partir d’un fichier des caractères un par un. Convertit les octets lus en caractères Unicode. Constructeurs de la classe FileReader: public FileReader(String fileName) throws FileNotFoundException public FileReader(File file) throws FileNotFoundException

FLUX ET FICHIERS Les classes Reader et Writer Lecture de texte à partir d’autres sources en entrée : Utiliser la classe InputStreamReader Exemple : Lecture à partir des frappes du clavier InputStreamReader in = new InputStreamReader(System.in);

FLUX ET FICHIERS Les classes Reader et Writer Ecriture de texte dans un fichier : FileWriter Permet d’écrire dans un fichier des caractères un par un. Convertit les caractères Unicode en octets dans le codage particulier de caractères du système d’exploitation. Constructeurs de la classe FileWriter: public FileWriter(String fileName) throws FileNotFoundException public FileWriter(File file)

FLUX ET FICHIERS Les classes Reader et Writer Les sous-classes BufferedReader et PrintWriter : Par défaut, les flux ne sont pas bufférisés. Chaque caractère lu ou écrit sous forme de code Unicode entraîne un appel système. Si on souhaite lire les lignes les unes après les autres dans un fichier ou écrire des lignes dans un fichier, on pourra combiner les flux suivants : Pour la lecture FileReader et BufferedReader . Pour l’écriture FileWriter et PrintWriter.

FLUX ET FICHIERS La classe BufferedReader Exemple1 : Cette classe fournit la méthode readLine() : public String readLine () throws IOException Exemple1 : FileReader f = new FileReader ("texte.txt"); BufferedReader b = new BufferedReader ( f ); String ligne = b.readLine ();

La classe BufferedReader FLUX ET FICHIERS La classe BufferedReader La méthode readLine renvoie null lorsqu’il ne reste plus d’entrée. Exemple2 : BufferedReader b = new BufferedReader ( new InputStreamReader(System.in) ); String s; while ((s= b.readLine())!=null){ //traitement de s }

Les classes BufferedReader et Scanner FLUX ET FICHIERS Les classes BufferedReader et Scanner La JDK5.0 propose la classe java.util.Scanner qui rend plus aisée la lecture et l’analyse des chaînes de caractères et des types primitifs en utilisant des expressions régulières.

Les classes BufferedReader et Scanner FLUX ET FICHIERS Les classes BufferedReader et Scanner

FLUX ET FICHIERS Les classes BufferedReader et Scanner Exemple : String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.print(s.nextInt()); System.out.print(s.nextInt()); System.out.print(s.next()); System.out.println(s.next()); s.close(); 1 2 red blue 26

FLUX ET FICHIERS La classe PrintWriter FileWriter et PrintWriter La classe PrintWriter fournit la méthode println() : public void println ( String x ) FileWriter fw = new FileWriter ("doc.txt"); PrintWriter out = new PrintWriter ( fw ); out.println ( "ceci est un texte" );

Les classes d’entrées/sorties FLUX ET FICHIERS Les classes d’entrées/sorties Exemple : Conversion d’un fichier texte en majuscules import java.io.*; public class ConvertMajuscules { public static void main (String [] args){ try{ FileReader f= new FileReader("in.txt"); BufferedReader in= new BufferedReader(f); PrintWriter out= new PrintWriter("out.txt"); String ligne = null; int nbLignes =0;

FLUX ET FICHIERS try{//utilisation de la ressource while ((ligne=in.readLine())!=null){ out.println(ligne.toUpperCase()); ++nbLignes; } System.out.println( "Copies de "+ nbLignes + "lignes."); }finally {//libération de la ressource in.close(); out.close();} } catch (IOException e){ System.out.println("exception "+e); }  //fin du main }//fin de ConvertMajuscules

Les classes d’entrées/sorties FLUX ET FICHIERS Les classes d’entrées/sorties Exemple2 : Lire un fichier texte et en compter le nombre de caractères. import java.io.*; public class CompteCaracteres{ File f; public int nbCaracteres(String nom){     int nb = 0;     f = new File(nom);     FileReader fr= new FileReader(f);     while(fr.read()!= -1)      nb++;     return nb; } }

Les classes d’entrées/sorties FLUX ET FICHIERS Les classes d’entrées/sorties Exemple2 : Lire un fichier texte et en compter le nombre de caractères. Le nom du fichier est passé en paramètre sur la ligne de commande. public class Main{ public static void main(String[] args){  CompteCaracteres wc = new CompteCaracteres();  System.out.println(wc.nbCaracteres(args[0])); }

Les classes d’entrées/sorties FLUX ET FICHIERS Les classes d’entrées/sorties Exemple2 : Lire un fichier texte et en compter le nombre de caractères. On obtient deux erreurs de compilation: ligne 12: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown FileReader fr = new FileReader(f); ligne 13: unreported exception java.io.IOException; must be caught or declared to be thrown while(fr.read() != -1)

Les classes d’entrées/sorties FLUX ET FICHIERS Les classes d’entrées/sorties Exemple2 : Lire un fichier texte et en compter le nombre de caractères. Modifier le code pour capturer les exceptions, et notamment celle provoquée par le fichier non trouvé, faites en sorte que l’utilisateur puisse saisir un autre nom.

FLUX ET FICHIERS Exemple2 : Lire un fichier texte et en compter le nombre de caractères. import java.io.*; public class CompteCaracteres{ File f; public int nbCaracteres(String nom) throws IOException, FileNotFoundException {   int nb = 0;   f = new File(nom);   FileReader fr= new FileReader(f);   while(fr.read() != -1)    nb++;     return nb;   } }

FLUX ET FICHIERS import java.io.*; public class Main { public static void main(String[] args) throws IOException { boolean fichierInexistant = true; String monFichier = args[0]; boolean problemeFichier = false; CompteCaracteres wc= new CompteCaracteres(); while (fichierInexistant == true) { if (problemeFichier == true){ System.out.print("Autre nom : ");     // conversion octet / caractères Unicode     Scanner sc = new Scanner (System.in); monFichier = sc.nextLine(); } …      

FLUX ET FICHIERS try { int nb = wc.nbCaracteres(monFichier); System.out.println(nb);   fichierInexistant = false; } catch(FileNotFoundException e){ System.out.println(" non trouve" ); problemeFichier =true; }    }

Exemples d’utilisation des flux FLUX ET FICHIERS Exemples d’utilisation des flux Exemple1: Sauvegarder des données du même type CompteCourant au format texte. Exemple2 : Sauvegarder des données polymorphes, par exemple le contenu d’un tableau de comptes bancaires de type CompteCourant ou CompteEpargne.

Exemples d’utilisation des flux FLUX ET FICHIERS Exemples d’utilisation des flux Exemple1: On complète la classe CompteCourant avec deux méthodes: public void ecrire(PrintWriter sortie){ sortie.println( getNom() +"|" + getAdresse() +"|" + getSolde()+"|"+tauxAgios ); } qui utilise un flux de sortie bufférisé pour écrire les données correspondant à un compte courant , les champs étant séparés par le délimiteur (|). Exemple : Dupont|rue de Bourgogne|1000|0.2

FLUX ET FICHIERS public void lire (BufferedReader entree) throws IOException{ String s =entree.readLine(); StringTokenizer str= new StringTokenizer(s,"|"); this.setNom(str.nextToken()); this.setAdresse(str.nextToken()); this.crediter(Integer.parseInt(str.nextToken())); this.tauxAgios=Double.parseDouble(str.nextToken();

FLUX ET FICHIERS public void lire (BufferedReader entree) throws IOException{ String l =entree.readLine(); Scanner s= new Scanner(l).useDelimiter("|"); System.out.println(s.nextInt()); System.out.println(s.next()); setNom(s.next()); setAdresse(s.next()); crediter(s.nextInt())); setTauxAgios(s.nextDouble()); } 40

Exemples d’utilisation des flux FLUX ET FICHIERS Exemples d’utilisation des flux Exemple1: La méthode lire utilise un flux d’entrée bufférisé pour lire les données correspondant à un compte courant. 1 - Lecture de la ligne avec la méthode readLine(). 2 – Extraction de chaque champ. Utilisation de la classe java.util.StringTokenizer en lui passant le délimiteur choisi en paramètre (ici : |).

Exemples d’utilisation des flux FLUX ET FICHIERS Exemples d’utilisation des flux Exemple1: Application Ecriture du contenu d’un tableau de comptes courants dans un fichier. Lecture des enregistrements de plusieurs comptes courants à partir d’un fichier et création du tableau de comptes courants correspondant.

Exemples d’utilisation des flux FLUX ET FICHIERS Exemples d’utilisation des flux Exemple1: Application public static void ecrire(CompteCourant[] lesComptes, PrintWriter sortie) { sortie.println(lesComptes.length); for (CompteCourantcompte:lesComptes) { compte.ecrire (sortie); }

Exemples d’utilisation des flux FLUX ET FICHIERS Exemples d’utilisation des flux Exemple1: Application public static CompteCourant[] lireDonnees(BufferedReader entree) throws IOException { int n= Integer.parseInt(entree.readLine()); CompteCourant[] lesComptes= new CompteCourant[n]; for (int i = 0; i<lesComptes.length; i++){ lesComptes[i] = new CompteCourant(); lesComptes[i].lireDonnees(entree); } return lesComptes;

Exemples d’utilisation des flux FLUX ET FICHIERS Exemples d’utilisation des flux Exemple2 : Pour enregistrer dans un fichier agence.txt des comptes courants et des comptes d’épargne, il faudrait : enregistrer le type de chaque objet. Enregistrer les données de l’objet Pour lire le fichier, il faudrait Lire le type de l’objet Créer un objet vide de ce type Y placer les données provenant du fichier

Les flux d’objets et la sérialisation FLUX ET FICHIERS Les flux d’objets et la sérialisation Une solution adaptée aux enregistrements de différents types : Ecriture d’un objet avec la classe ObjectOutputStream Lecture d’un objet avec la classe ObjectInputStream

Les flux d’objets et la sérialisation FLUX ET FICHIERS Les flux d’objets et la sérialisation Ecriture d’un objet avec la méthode writeObject de la classe ObjectOutputStream ObjectOutputStream sortie = new ObjectOutputStream ( new FileOutputStream("agence.ser")); CompteBancaire c1 = new CompteCourant ("Dupont", "a1",0.2); sortie.writeObject(c1);

Les flux d’objets et la sérialisation FLUX ET FICHIERS Les flux d’objets et la sérialisation Lecture d’un objet avec la méthode readObject de la classe ObjectInputStream ObjectInputStream entree = new ObjectInputStream (new FileInputStream("agence.txt")); CompteBancaire c1= (CompteBancaire)entree.readObject();

Les flux d’objets et la sérialisation FLUX ET FICHIERS Les flux d’objets et la sérialisation La classe CompteBancaire doit implémenter l’interface Serializable. Cette interface ne possède aucune méthode.

FLUX ET FICHIERS Exemples d’utilisation des flux Retour à l’exemple2 : Ecriture dans le fichier agence.txt du contenu d’un tableau de comptes bancaires CompteBancaire[] lesComptes = new CompteBancaire[2]; CompteBancaire c1 = new CompteCourant ("Duval", "a2",0.02); c1.crediter (500); CompteBancaire c2 = new CompteEpargne ("Martin", "a3",0.03); c2.crediter(200);

Exemples d’utilisation des flux FLUX ET FICHIERS Exemples d’utilisation des flux Retour à l’exemple2 : Ecriture dans le fichier agence.txt du contenu d’un tableau de comptes bancaires lesComptes[0] = c1; lesComptes[1] = c2; ObjectOutputStream sortie = new ObjectOutputStream (new FileOutputStream("agence.txt")); sortie.writeObject(lesComptes);

FLUX ET FICHIERS Exemples d’utilisation des flux Exemple2 : Lecture dans le fichier agence.txt pour créer un tableau de comptes ObjectInputStream entree = new ObjectInputStream (new FileInputStream("agence.txt")); CompteBancaire[] lesNouveauxComptes = (CompteBancaire[])entree.readObject(); lesNouveauxComptes [0].traitementQuotidien(); lesNouveauxComptes [1].traitementQuotidien(); Les objets sont recréés avec leur type correct, CompteCourant ou CompteEpargne.

La sérialisation FLUX ET FICHIERS Que se passe-t-il quand plusieurs objets contiennent une référence à un même objet? :ClasseA :ClasseB x :ClasseA désigne un objet instance de la ClasseA

La sérialisation FLUX ET FICHIERS Il ne faut pas que l’objet de type ClasseB soit enregistré deux fois dans le fichier sinon au rechargement du fichier, on aura une nouvelle configuration: :ClasseB :ClasseA x :ClasseB :ClasseA x

La sérialisation FLUX ET FICHIERS Il faut que les références aux objets soient copiées et rechargées telles qu’elles sont initialement. Java utilise la sérialisation des objets pour garantir cela : Tous les objets sauvegardés sur disque reçoivent un numéro d’ordre (1, 2, 3…) Quand un objet est enregistré sur disque, il faut rechercher si le même objet a déjà été sauvegardé. Si c’est le cas, l’objet est marqué comme « identique à un objet déjà sauvegardé et possédant le numéro d’ordre x ».

La sérialisation FLUX ET FICHIERS :ClasseB :ClasseA x MEMOIRE :ClasseA 1 :ClasseA 2 :ClasseA 3 :ClasseB FICHIER x = 3 x = 3

Extensions « Conclusion » Flux = café !

Patron décorateur / decorator Les E/S en Java : écrire son propre décorateur de Stream public class MinusculeInputStream extends FilterInputStream { public MinusculeInputStream(InputStream in) { super(in); } public int read() throws IOException { int c = super.read(); return (c == -1 ? c : Character.toLowerCase((char)c)); public int read(byte[] b, int offset, int len) throws IOException { int result = super.read(b, offset, len); for (int i = offset; i < offset+result; i++) { b[i] = (byte)Character.toLowerCase((char)b[i]); return result; public abstract class Boisson { String description = "Boisson inconnue"; public String getDescription() { return description; } public abstract double cout(); public class StarBuzz { public static void main(String args[]) { Boisson b1 = new Espresso(); System.out.println(b1.getDescription() + " à " + b1.cout()); Boisson boisson2 = new Sumatra(); boisson2 = new Chocolat(boisson2); boisson2 = new Chantilly(boisson2); System.out.println(boisson2.getDescription() + " €" + boisson2.cout()); } public class Chocolat extends DecorateurIngredient { Boisson boisson; public Chocolat(Boisson boisson) { this.boisson = boisson; } public String getDescription() { return boisson.getDescription() + ", Chocolat"; public double cout() { return .20 + boisson.cout(); public abstract class DecorateurIngredient extends Boisson { public abstract String getDescription(); }

décorateur de Stream Les E/S en Java : écrire son propre public class TestEntree { public static void main(String[] args) throws IOException { int c; try { InputStream in = new MinusculeInputStream( new BufferedInputStream( new FileInputStream("test.txt"))); while((c = in.read()) >= 0) { System.out.print((char)c); } in.close(); } catch (IOException e) { e.printStackTrace(); public abstract class Boisson { String description = "Boisson inconnue"; public String getDescription() { return description; } public abstract double cout(); public class StarBuzz { public static void main(String args[]) { Boisson b1 = new Espresso(); System.out.println(b1.getDescription() + " à " + b1.cout()); Boisson boisson2 = new Sumatra(); boisson2 = new Chocolat(boisson2); boisson2 = new Chantilly(boisson2); System.out.println(boisson2.getDescription() + " €" + boisson2.cout()); } public class Chocolat extends DecorateurIngredient { Boisson boisson; public Chocolat(Boisson boisson) { this.boisson = boisson; } public String getDescription() { return boisson.getDescription() + ", Chocolat"; public double cout() { return .20 + boisson.cout(); public abstract class DecorateurIngredient extends Boisson { public abstract String getDescription(); }