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

1 COURS DE PROGRAMMATION ORIENTEE OBJET : Flux et Fichiers.

Présentations similaires


Présentation au sujet: "1 COURS DE PROGRAMMATION ORIENTEE OBJET : Flux et Fichiers."— Transcription de la présentation:

1 1 COURS DE PROGRAMMATION ORIENTEE OBJET : Flux et Fichiers

2 2 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 dentrée. Les données ressortent via un flux de sortie.

3 3 Les classes dentrées/sorties –Elles sont définies dans le paquetage java.io. EntréeSortie Binaire InputStreamOutputStream Texte ReaderWriter FLUX ET FICHIERS

4 4 Les classes dentré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. FLUX ET FICHIERS

5 5 Les classes dentré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. FLUX ET FICHIERS

6 6 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. FLUX ET FICHIERS

7 7 InputStream et ses sous-classes –Lobjet prédéfini System.in de type InputStream permet de saisir linformation à 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. FLUX ET FICHIERS

8 8 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. FLUX ET FICHIERS

9 9 InputStream et ses sous-classes –Combinaison de flux FileInputStream permet daccéder aux données dun 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 dun fichier mais possède des méthodes qui assemblent les octets en types de données numériques. FLUX ET FICHIERS

10 10 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 dun objet DataInputStream La classe DataInputStream fournit par exemple la méthode : public final double readDouble() throws IOException FLUX ET FICHIERS

11 11 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

12 12 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. FLUX ET FICHIERS

13 13 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 dexploitation mais pourront être lues par un programme Java avec les méthodes correspondantes de la classe DataInputStream. FLUX ET FICHIERS

14 14 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 lhomme. FLUX ET FICHIERS

15 15 Les flux de texte –Codage de caractères : Java utilise le codage de caractères Unicode. Chaque système dexploitation utilise son propre système de codage de caractères. FLUX ET FICHIERS

16 16 Les flux de texte –Codage de caractères : Java va fournir des classes permettant –dobtenir des caractères Unicode à partir dun flux dentrée contenant des octets dans un codage particulier de type caractères ( InputStreamReader ). –Dobtenir un flux doctets dans un codage particulier de type caractères à partir dun flux de caractères Unicode ( OutputStreamReader ). FLUX ET FICHIERS

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

18 18 Les classes Reader et Writer –Lecture de texte à partir dun fichier : FileReader Permet de lire à partir dun 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 FileNotFoundExceptionStringFileNotFoundException – public FileReader(File file) throws FileNotFoundExceptionFile FileNotFoundException FLUX ET FICHIERS

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

20 20 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 dexploitation. Constructeurs de la classe FileWriter : public FileWriter(String fileName)String throws FileNotFoundExceptionFileNotFoundException public FileWriter(File file)File throws FileNotFoundExceptionFileNotFoundException FLUX ET FICHIERS

21 21 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

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

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

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

25 25 Les classes BufferedReader et Scanner FLUX ET FICHIERS

26 26 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 FLUX ET FICHIERS

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

28 28 Les classes dentrées/sorties Exemple : Conversion dun 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

29 29 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 FLUX ET FICHIERS

30 30 Les classes dentré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; } } FLUX ET FICHIERS

31 31 Les classes dentré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])); } FLUX ET FICHIERS

32 32 Les classes dentré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) FLUX ET FICHIERS

33 33 Les classes dentré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 lutilisateur puisse saisir un autre nom. FLUX ET FICHIERS

34 34 –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

35 35 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

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

37 37 Exemples dutilisation 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 dun tableau de comptes bancaires de type CompteCourant ou CompteEpargne. FLUX ET FICHIERS

38 38 Exemples dutilisation 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

39 39 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

40 40 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()); } FLUX ET FICHIERS

41 41 Exemples dutilisation des flux Exemple1: La méthode lire utilise un flux dentré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 : |). FLUX ET FICHIERS

42 42 Exemples dutilisation des flux Exemple1: Application 1.Ecriture du contenu dun tableau de comptes courants dans un fichier. 2.Lecture des enregistrements de plusieurs comptes courants à partir dun fichier et création du tableau de comptes courants correspondant. FLUX ET FICHIERS

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

44 44 Exemples dutilisation 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

45 45 Exemples dutilisation 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 lobjet Pour lire le fichier, il faudrait –Lire le type de lobjet –Créer un objet vide de ce type –Y placer les données provenant du fichier FLUX ET FICHIERS

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

47 47 Les flux dobjets et la sérialisation –Ecriture dun 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); FLUX ET FICHIERS

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

49 49 Les flux dobjets et la sérialisation –La classe CompteBancaire doit implémenter linterface Serializable. –Cette interface ne possède aucune méthode. FLUX ET FICHIERS

50 50 Exemples dutilisation des flux –Retour à lexemple2 : Ecriture dans le fichier agence.txt du contenu dun 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); FLUX ET FICHIERS

51 51 Exemples dutilisation des flux –Retour à lexemple2 : Ecriture dans le fichier agence.txt du contenu dun tableau de comptes bancaires lesComptes[0] = c1; lesComptes[1] = c2; ObjectOutputStream sortie = new ObjectOutputStream (new FileOutputStream("agence.txt")); sortie.writeObject(lesComptes); FLUX ET FICHIERS

52 52 Exemples dutilisation 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. FLUX ET FICHIERS

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

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

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

56 56 La sérialisation :ClasseA :ClasseB x x MEMOIRE 123 :ClasseA :ClasseB x = 33 FICHIER FLUX ET FICHIERS

57 57 Extensions « Conclusion » Flux = café !

58 58 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; } }

59 59 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(); } } }


Télécharger ppt "1 COURS DE PROGRAMMATION ORIENTEE OBJET : Flux et Fichiers."

Présentations similaires


Annonces Google