1 Java : Les FLUX de données Les flux de données introduction les flux binaires les flux binaires de sortie (FBS) les flux binaires d entrée (FBE) les flux textes (FTS & FTE) les flux textes de sortie (FTS) les flux textes d entrée (FTE) hiérarchie du package "java.io" (2) (4) (7) (10) (11) (12) (13)
2 Java : Flux / Introduction Définition : Un flux est un canal permettant de faire transiter de l information sous forme d une suite d octets. La notion de flux est très générale puisqu elle 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 D autre part, les flux sont particularisés selon le sens : d ENTRÉE Flux en lecture (délivrant de l information) FLUX de SORTIE Flux en écriture (recevant de l information) selon le mode : FLUX BINAIRE TEXTE L information transite sans aucune modification L information qui transite subit une transformation (formatage) sous forme de suite de caractères
3 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 l entier 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 l entier 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 n ont d autres utilité que d encapsuler d autres flux pour fournir des fonctionnalités supplémentaires. Ex: Un flux d entrée standard peut être encapsulé dans un flux gérant un tampon (buffer). Ainsi, tant que le tampon n est pas plein, les écritures dans le flux global s effectueront instantanément (grâce à un thread qui s occupe d écrire en tâche de fond).
4 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.lang.object Java : Les flux binaires de sortie (FBS) 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 à l aide 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 d objets, persistance d objet en fichier class java.io.pipedoutputstream // OutputStream connecté à un InputStream Les FBS permettent d écrire des suites d octets, de valeurs de type primitif ou d objets dans des fichiers, en mémoire ou au travers de sockets. octets valeurs de type primitif objets FBS en fichier en mémoire au travers d une socket vers un périphérique de communication
5 Java : Les flux binaires de sortie (FBS) Principales fonctionnalités de FBS pour l écriture en fichier abstract OutputStream Classe de base pour les FBS méthodes IOException void write (int b), void write (byte[] b),... void close (), void flush () FileOutputStream FileNotFoundException SecurityException abstract FilterOutputStream FBS associé à un fichier (nouveau, détruit ou ajout) constructeurs FileOutputStream (File file),... FileOutputStream (String filename),... Classe de base pour les filtres (encapsulation de FBS) DataOutputStream Filtre permettant l écriture de types primitifs (encapsulation de FBS) constructeurs DataOutputStream (OutputStream out) IOException BufferedOutputStream méthodes void writexxx (Xxx b) où Xxx = Boolean, Byte,... Void writeutf (String str) codage unicode... Filtre permettant l utilisation d un tampon (encapsulation de FBS) constructeurs BufferedOutputStream (OutputStream out),...
6 Java : Les flux binaires de sortie (FBS) Exemples de FBS pour l écriture en fichier 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 d exploitation 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 d un objet File File f = new File("c:\ApplicationData", "mydata.dat"); if (!f.exists() ) { // Rq: l objet 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.
7 class java.lang.object Java : Les flux binaires d entrée (FBE) Hiérarchie de classes (FBE) Flux d entré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 à l aide 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 d objets 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 Les FBE permettent de lire des suites d octets, de valeurs de type primitif ou d objets dans des fichiers, en mémoire, au travers de sockets ou depuis un périphérique de communication. depuis un fichier depuis la mémoire au travers d une socket depuis un périphérique de communication FBE octets valeurs de type primitif objets
8 Java : Les flux binaires d entrée (FBE) Principales fonctionnalités de FBE pour la lecture de fichier abstract InputStream Classe de base pour les FBE méthodes IOException int read (int b), int read (byte[] b), void close () long skip (long n), int available(), void reset(),... FileInputStream FileNotFoundException SecurityException FBE associé à un fichier (existant) constructeurs FileInputStream (File file),... FileInputStream (String filename),... abstract FilterInputStream Classe de base pour les filtres (encapsulation de FBE) DataInputStream IOException EOFException BufferedInputStream Filtre permettant la lecture de types primitifs (encapsulation de FBE) constructeurs DataInputStream (InputStream in) méthodes xxx readxxx () où Xxx = Boolean, Byte,... final String readutf () codage unicode void readfully (byte[] b),... Filtre permettant l utilisation d un tampon (encapsulation de FBE) constructeurs BufferedInputStream (InputStream in),...
9 Java : Les flux binaires d entrée (FBE) Exemples de FBE pour la lecture de fichier 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 d un objet File File f = new File("c:\ApplicationData", "mydata.dat"); if ( f.exists() ) { // Rq: l objet 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.
10 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 l API Java) class java.io.outputstreamwriter // conversion de flux de caractères en flux de bytes class java.io.filewriter // écriture dans un fichier à l aide write( ) class java.io.pipedwriter // OutputStream connecté à un InputStream class java.io.printwriter // filtre ajoutant l écriture de types primitifs à l aide de write( ), print( ) et println( ) class java.io.stringwriter // écriture dans un string buffer prêt à être converti en String Hiérarchie de classes (FTE) Flux de caractères Reader class java.lang.object Java : Les flux textes (FTS & FTE) class java.io.reader // abstract class 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 // filtre pour ajouter un tampon de lecture à l aide de int read() et String readline() // filtre gérant le numéro de la ligne courante // lecture depuis un tableau en mémoire // abstract class // filtre ajoutant la capacité de lecture arrière // conversion de flux de bytes en flux de caractères // lecture depuis un fichier à l aide de int read() // InputStream connecté à un OutputStream // flux de lecture depuis un String
11 Java : Les flux textes de sortie (FTS) Exemples de FTS pour l écriture en fichier --- Flux FTS --- 1) // FTS simple permettant d utiliser write( ) FileWriter fts1 = new FileWriter ("mydata.dat"); 2) // FTS permettant d utiliser print( ) et println( ) PrintWriter fts2 = new PrintWriter (new FileWriter ("mydata.dat")); 3) // FTS permettant d utiliser 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: L exception IOException peut survenir dans chaque exemple.
12 Java : Les flux textes d entrée (FTE) Exemples de FTE pour la lecture de fichier --- Flux FTE --- 1) // FTE simple permettant d utiliser int read() FileReader fte1 = new FileReader ("mydata.dat"); 2) // FTE permettant d utiliser String readline() LineNumberReader fte2 = new LineNumberReader (new FileReader ("mydata.dat")); 3) // FTE permettant d utiliser 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(). D où le fait que, dans l exemple n 3, il n a pas été utilisé de LineNumberReader. Rq: Dans chaque exemple : - l exception IOException peut survenir, - la méthode boolean ready() est disponible.
13 Java : Hiérarchie du package "java.io" 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 d entré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
14 Java : Hiérarchie du package "java.io" 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 d analyse grammaticale StreamTokenizer class java.io.streamtokenizer
15 Java : Hiérarchie du package "java.io" 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) A noter que de nombreuses classes sont définies pour être composées avec d autres ; elles agissent comme des filtres sur les flux encapsulés. Souvent ces classes sont dérivées d une classe dont le nom comporte le préfixe Filter ou Buffered (ex: FilterOutputStream ou BufferedWriter). D une manière générale, pour voir comment composer plusieurs classes, et donc en utiliser certaines comme filtres, ce n est pas tant leur diagramme d héritage qui compte que les arguments de leurs constructeurs (ex: le constructeur BufferedReader(Reader in) suggère l encapsulation d un Reader, i.e. un flux quelconque d entrée de caractères).