1 Cours JAVA / Y.Laborde Java : Les FLUX de données Les flux de données introduction les flux binaires les flux binaires de sortie (FBS) les flux binaires dentrée (FBE) les flux textes (FTS & FTE) les flux textes de sortie (FTS) les flux textes dentrée (FTE) hiérarchie du package "java.io" (2) (4) (7) (10) (11) (12) (13)
2 Cours JAVA / Y.Laborde La notion de flux est très générale puisquelle désigne simplement un canal pouvant être connecté à différentes sources (entrées) ou cibles (sorties), soit : à des fichiers à des périphériques de communication à des emplacement mémoire à des sites distants Java : Flux / Introduction Définition : Un flux est un canal permettant de faire transiter de linformation sous forme dune suite doctets. FLUX de SORTIE d ENTRÉE Flux en lecture (délivrant de linformation) Flux en écriture (recevant de linformation) FLUX TEXTE BINAIRE Linformation transite sans aucune modification Linformation qui transite subit une transformation (formatage) sous forme de suite de caractères …selon le sens : …selon le mode : Dautre part, les flux sont particularisés…
3 Cours JAVA / Y.Laborde Java : Flux / Introduction Différence entre flux BINAIRE et flux TEXTE Soit la déclaration : int i = 129 ; Avec un flux BINAIRE : f.writeInt (i) ; envoie dans le flux les octets successifs correspondant au codage en mémoire de lentier i, soit : 0x00 / 0x00 / 0x00 / 0x81 Avec un flux TEXTE : f.println (i) ; envoie dans le flux les octets successifs correspondant aux caractères de lentier i, soit : "1" / "2" / "9" Rq : les méthodes décriture dans les flux diffèrent car elles sont héritées de \nclasses différentes. Hiérarchie Java pour les flux – le package "java.io" En Java, il existe quelques 50 classes, 10 interfaces et 16 Exceptions intervenant dans la manipulation des flux ! Sans les étudier toutes, il faut avoir une connaissance des différents types de flux et de leurs compositions. En effet, certaines classes de flux nont dautres utilité que dencapsuler dautres flux pour fournir des fonctionnalités supplémentaires. Ex: Un flux dentrée standard peut être encapsulé dans un flux gérant un tampon (buffer). Ainsi, tant que le tampon nest pas plein, les écritures dans le flux global seffectueront instantanément (grâce à un thread qui soccupe décrire en tâche de fond).
4 Cours JAVA / Y.Laborde Les FBS permettent décrire des suites doctets, de valeurs de type primitif ou dobjets dans des fichiers, en mémoire ou au travers de sockets. class java.lang.Object Hiérarchie de classes (FBS) ______________________________________ Flux de sortie OutputStream _____________________________________ class java.io.OutputStream// abstract class class java.io.ByteArrayOutputStream// écriture dans un tableau en mémoire class java.io.FileOutputStream// écriture dans un fichier class java.io.FilterOutputStream // abstract class class java.io.BufferedOutputStream// filtre ajoutant un tampon décriture class java.io.DataOutputStream (implements java.io.DataOutput) // filtre ajoutant lécriture de types primitifs à laide de writeXxx(…) class java.io.PrintStream // filtre combinant plusieurs fonctionnalités !!! dont print(…) et println(…) class java.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants) // sérialisation dobjets, persistance dobjet en fichier class java.io.PipedOutputStream// OutputStream connecté à un InputStream valeurs de type primitif octets objets FBS en fichier en mémoire au travers dune socket vers un périphérique de communication Java : Les flux binaires de sortie (FBS)
5 Cours JAVA / Y.Laborde Java : Les flux binaires de sortie (FBS) Principales fonctionnalités de FBS pour lécriture en fichier IOException FileNotFoundException SecurityException FileOutputStream (File file),... FileOutputStream (String fileName),... constructeurs Classe de base pour les FBS OutputStream abstract DataOutputStream (OutputStream out) constructeurs FBS associé à un fichier (nouveau, détruit ou ajout) FileOutputStream Classe de base pour les filtres (encapsulation de FBS) FilterOutputStream abstract IOException void writeXxx (Xxx b) où Xxx = Boolean, Byte,... Void writeUTF (String str) codage unicode... méthodes constructeurs BufferedOutputStream (OutputStream out),... void write (int b), void write (byte[] b),... void close (), void flush () méthodes Filtre permettant lutilisation dun tampon (encapsulation de FBS) BufferedOutputStream Filtre permettant lécriture de types primitifs (encapsulation de FBS) DataOutputStream
6 Cours JAVA / Y.Laborde Java : Les flux binaires de sortie (FBS) 1)// FBS simple FileOutputStream fbs1 = new FileOutputStream("myData.dat"); 2)// FBS pour types primitifs DataOutputStream fbs2 = new DataOutputStream (new FileOutputStream("myData.dat")); 3)// FBS pour types primitifs avec tampon (*) DataOutputStream fbs3 = new DataOutputStream (new BufferedOutputStream (new FileOutputStream("myData.dat"))); (*) généralement inutile car le système dexploitation utilise son propre tampon Rq: le BufferOutputStream est lui-même encapsulé dans le DataOutputStream car on désire au final un flux doté des méthodes décriture pour des types primitifs. 4) // FBS simple à partir dun objet File File f = new File("c:\ApplicationData", "myData.dat"); if ( !f.exists() ) { // Rq: lobjet File permet de tester le fichier avant de définir le flux FileOutputStream fbs4 = new FileOutputStream(f);... } Rq: Les exceptions FileNotFoundException ou SecurityException peuvent survenir dans chaque exemple. Exemples de FBS pour lécriture en fichier
7 Cours JAVA / Y.Laborde Les FBE permettent de lire des suites doctets, de valeurs de type primitif ou dobjets dans des fichiers, en mémoire, au travers de sockets ou depuis un périphérique de communication. class java.lang.Object Hiérarchie de classes (FBE) ______________________________________ Flux dentrée InputStream _____________________________________ class java.io.InputStream // abstract class class java.io.ByteArrayInputStream// lecture depuis un tableau en mémoire class java.io.FileInputStream// lecture depuis un fichier class java.io.FilterInputStream // abstract class class java.io.BufferedInputStream // filtre ajoutant un tampon de lecture class java.io.DataInputStream (implements java.io.DataInput) // filtre ajoutant la lecture de types primitifs à laide de xxx readXxx() class java.io.LineNumberInputStream// filtre gérant le numéro de la ligne courante class java.io.PushbackInputStream // filtre ajoutant la capacité de lecture arrière class java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants) // désérialisation dobjets class java.io.PipedInputStream// InputStream connecté à un OutputStream class java.io.SequenceInputStream// concaténation de plusieurs InputStream class java.io.StringBufferInputStream // conversion de flux de byte en flux de caractères valeurs de type primitif octets objets FBE depuis un fichier depuis la mémoire au travers dune socket depuis un périphérique de communication Java : Les flux binaires dentrée (FBE)
8 Cours JAVA / Y.Laborde Java : Les flux binaires dentrée (FBE) Principales fonctionnalités de FBE pour la lecture de fichier IOException FileNotFoundException SecurityException FileInputStream (File file),... FileInputStream (String fileName),... constructeurs Classe de base pour les FBE InputStream abstract DataInputStream (InputStream in) constructeurs FBE associé à un fichier (existant) FileInputStream Classe de base pour les filtres (encapsulation de FBE) FilterInputStream abstract IOException EOFException xxx readXxx () où Xxx = Boolean, Byte,... final String readUTF () codage unicode void readFully (byte[] b),... méthodes constructeurs BufferedInputStream (InputStream in),... int read (int b), int read (byte[] b), void close () long skip (long n), int available(), void reset(),... méthodes Filtre permettant la lecture de types primitifs (encapsulation de FBE) DataInputStream Filtre permettant lutilisation dun tampon (encapsulation de FBE) BufferedInputStream
9 Cours JAVA / Y.Laborde Java : Les flux binaires dentrée (FBE) 1)// FBE simple FileInputStream fbe1 = new FileInputStream("myData.dat"); 2)// FBE pour types primitifs DataInputStream fbe2 = new DataInputStream (new FileInputStream("myData.dat")); 3)// FBE pour types primitifs avec tampon DataInputStream fbe3 = new DataInputStream (new BufferedInputStream (new FileInputStream("myData.dat"))); Rq: le BufferInputStream est lui-même encapsulé dans le DataInputStream car on désire au final un flux doté des méthodes de lecture pour des types primitifs. 4) // FBE simple à partir dun objet File File f = new File("c:\ApplicationData", "myData.dat"); if ( f.exists() ) { // Rq: lobjet File permet de tester le fichier avant de définir le flux FileInputStream fbe4 = new FileInputStream(f);... } Rq: Les exceptions FileNotFoundException ou SecurityException peuvent survenir dans chaque exemple. Exemples de FBE pour la lecture de fichier
10 Cours JAVA / Y.Laborde class java.lang.Object Hiérarchie de classes (FTS) ___________________________________ Flux de caractères Writer _____________________________________ class java.io.Writer // abstract class class java.io.BufferedWriter// filtre pour ajouter un tampon décriture class java.io.CharArrayWriter// écriture dans un tableau en mémoire class java.io.FilterWriter// abstract class (aucune sous classe dans lAPI Java) class java.io.OutputStreamWriter // conversion de flux de caractères en flux de bytes class java.io.FileWriter // écriture dans un fichier à laide write(…) class java.io.PipedWriter// OutputStream connecté à un InputStream class java.io.PrintWriter// filtre ajoutant lécriture de types primitifs à laide de write(…), print(…) et println(…) class java.io.StringWriter // écriture dans un string buffer prêt à être converti en String class java.lang.Object Hiérarchie de classes (FTE) _________________________________ Flux de caractères Reader _____________________________________ class java.io.Reader// abstract class class java.io.BufferedReader // filtre pour ajouter un tampon de lecture à laide de int read() et String readLine() class java.io.LineNumberReader // filtre gérant le numéro de la ligne courante class java.io.CharArrayReader// lecture depuis un tableau en mémoire class java.io.FilterReader // abstract class class java.io.PushbackReader // filtre ajoutant la capacité de lecture arrière class java.io.InputStreamReader // conversion de flux de bytes en flux de caractères class java.io.FileReader // lecture depuis un fichier à laide de int read() class java.io.PipedReader// InputStream connecté à un OutputStream class java.io.StringReader // flux de lecture depuis un String Java : Les flux textes (FTS & FTE)
11 Cours JAVA / Y.Laborde --- Flux FTS --- 1)// FTS simple permettant dutiliser write(…) FileWriter fts1 = new FileWriter ("myData.dat"); 2)// FTS permettant dutiliser print(…) et println(…) PrintWriter fts2 = new PrintWriter (new FileWriter ("myData.dat")); 3)// FTS permettant dutiliser print(…) et println(…) et avec un tampon PrintWriter fts3 = new PrintWriter (new BufferedWriter (new FileWriter ("myData.dat"))); Rq: le BufferWriter est lui-même encapsulé dans le PrintWriter car on désire au final un flux doté des méthodes décriture print(…) et println(…). Rq: Lexception IOException peut survenir dans chaque exemple. Exemples de FTS pour lécriture en fichier Java : Les flux textes de sortie (FTS)
12 Cours JAVA / Y.Laborde --- Flux FTE --- 1)// FTE simple permettant dutiliser int read() FileReader fte1 = new FileReader ("myData.dat"); 2)// FTE permettant dutiliser String readLine() LineNumberReader fte2 = new LineNumberReader (new FileReader ("myData.dat")); 3)// FTE permettant dutiliser String readLine() et avec un tampon BufferedReader fte3 = new BufferedReader (new FileReader ("myData.dat")); Rq: les classes BufferReader et LineNumberReader définissent la méthode de lecture String readLine(). Doù le fait que, dans lexemple n°3, il na pas été utilisé de LineNumberReader. Rq: Dans chaque exemple : - lexception IOException peut survenir, - la méthode boolean ready() est disponible. Exemples de FTE pour la lecture de fichier Java : Les flux textes dentrée (FTE)
13 Cours JAVA / Y.Laborde Hiérarchie de classes (1) class java.lang.Object _________________________________ File & FileDescriptor _______________________________________ class java.io.File (implements java.lang.Comparable, java.io.Serializable) class java.io.FileDescriptor ___________________________________ Flux dentrée InputStream _________________________________ class java.io.InputStream class java.io.ByteArrayInputStream class java.io.FileInputStream class java.io.FilterInputStream class java.io.BufferedInputStream class java.io.DataInputStream (implements java.io.DataInput) class java.io.LineNumberInputStream class java.io.PushbackInputStream class java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants) class java.io.PipedInputStream class java.io.SequenceInputStream class java.io.StringBufferInputStream ___________________________________ Flux de sortie OutputStream _______________________________ class java.io.OutputStream class java.io.ByteArrayOutputStream class java.io.FileOutputStream class java.io.FilterOutputStream class java.io.BufferedOutputStream class java.io.DataOutputStream (implements java.io.DataOutput) class java.io.PrintStream class java.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants) class java.io.PipedOutputStream Java : Hiérarchie du package "java.io"
14 Cours JAVA / Y.Laborde Hiérarchie de classes (2) class java.lang.Object _________________________________ Flux de caractères Reader _____________________________________ class java.io.Reader class java.io.BufferedReader class java.io.LineNumberReader class java.io.CharArrayReader class java.io.FilterReader class java.io.PushbackReader class java.io.InputStreamReader class java.io.FileReader class java.io.PipedReader class java.io.StringReader ___________________________________ Flux de caractères Writer _____________________________________ class java.io.Writer class java.io.BufferedWriter class java.io.CharArrayWriter class java.io.FilterWriter class java.io.OutputStreamWriter class java.io.FileWriter class java.io.PipedWriter class java.io.PrintWriter class java.io.StringWriter ____________________________ Flux danalyse grammaticale StreamTokenizer ______________________ class java.io.StreamTokenizer Java : Hiérarchie du package "java.io"
15 Cours JAVA / Y.Laborde Hiérarchie de classes (3) class java.lang.Object ______________________________ Flux de fichier à accès direct __________________________________ class java.io.RandomAccessFile (implements java.io.DataInput, java.io.DataOutput) _________________________________ Flux pour objets _________________________________________ (class java.io.InputStream) class java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants) class java.io.ObjectInputStream.GetField (class java.io.OutputStream) class java.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants) class java.io.ObjectOutputStream.PutField class java.io.ObjectStreamClass (implements java.io.Serializable) class java.io.ObjectStreamField (implements java.lang.Comparable) _________________________________ Securité & Permission ____________________________________ class java.security.Permission (implements java.security.Guard, java.io.Serializable) class java.security.BasicPermission (implements java.io.Serializable) class java.io.SerializablePermission class java.io.FilePermission (implements java.io.Serializable) Java : Hiérarchie du package "java.io" A noter que de nombreuses classes sont définies pour être composées avec dautres ; elles agissent comme des filtres sur les flux encapsulés. Souvent ces classes sont dérivées dune classe dont le nom comporte le préfixe Filter ou Buffered (ex: FilterOutputStream ou BufferedWriter). Dune manière générale, pour voir comment composer plusieurs classes, et donc en utiliser certaines comme filtres, ce nest pas tant leur diagramme dhéritage qui compte que les arguments de leurs constructeurs (ex: le constructeur BufferedReader(Reader in) suggère lencapsulation dun Reader, i.e. un flux quelconque dentrée de caractères).