200 likes | 357 Views
Java : Les FLUX de données. (2) (4) (7) (10) (11) (12) (13). 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)
E N D
Java : Les FLUX de données (2) (4) (7) (10) (11) (12) (13) • 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" Cours JAVA / Y.Laborde
D’autre part, les flux sont particularisés… …selon le sens : d’ ENTRÉE BINAIRE FLUX FLUX de SORTIE TEXTE …selon le mode : 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 Flux en lecture (délivrant de l’information) Flux en écriture (recevant de l’information) L’information transite sans aucune modification L’information qui transite subit une transformation (formatage) sous forme de suite de caractères 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 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). Cours JAVA / Y.Laborde
Java : Les flux binaires de sortie (FBS) en fichier octets FBS en mémoire valeurs de type primitif au travers d’une socket objets vers un périphérique de communication classjava.lang.Object Hiérarchie de classes (FBS) ______________________________________ Flux de sortie OutputStream _____________________________________ classjava.io.OutputStream // abstract class classjava.io.ByteArrayOutputStream // écriture dans un tableau en mémoire classjava.io.FileOutputStream // écriture dans un fichier classjava.io.FilterOutputStream // abstract class classjava.io.BufferedOutputStream // filtre ajoutant un tampon d’écriture classjava.io.DataOutputStream (implements java.io.DataOutput) // filtre ajoutant l’écriture de types primitifs à l’aide de writeXxx(…) classjava.io.PrintStream // filtre combinant plusieurs fonctionnalités !!! dont print(…) et println(…) classjava.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants) // sérialisation d’objets, persistance d’objet en fichier classjava.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. Cours JAVA / Y.Laborde
abstract OutputStream Classe de base pour les FBS méthodes void write (int b), void write (byte[] b), ... void close (), void flush () IOException FileOutputStream FBS associé à un fichier (nouveau, détruit ou ajout) constructeurs FileNotFoundException SecurityException FileOutputStream (File file), ... FileOutputStream (String fileName), ... abstract FilterOutputStream Classe de base pour les filtres (encapsulation de FBS) DataOutputStream Filtre permettant l’écriture de types primitifs (encapsulation de FBS) constructeurs DataOutputStream (OutputStream out) méthodes void writeXxx (Xxx b) où Xxx = Boolean, Byte, ... Void writeUTF (String str) codage unicode ... IOException BufferedOutputStream Filtre permettant l’utilisation d’un tampon (encapsulation de FBS) constructeurs BufferedOutputStream (OutputStream out), ... Java : Les flux binaires de sortie (FBS) Principales fonctionnalités de FBS pour l’écriture en fichier Cours JAVA / Y.Laborde
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. Cours JAVA / Y.Laborde
Java : Les flux binaires d’entrée (FBE) depuis un fichier octets FBE depuis la mémoire valeurs de type primitif au travers d’une socket objets depuis un périphérique de communication classjava.lang.Object Hiérarchie de classes (FBE) ______________________________________ Flux d’entrée InputStream _____________________________________ class java.io.InputStream // abstract class classjava.io.ByteArrayInputStream // lecture depuis un tableau en mémoire classjava.io.FileInputStream // lecture depuis un fichier classjava.io.FilterInputStream // abstract class classjava.io.BufferedInputStream // filtre ajoutant un tampon de lecture classjava.io.DataInputStream (implements java.io.DataInput) // filtre ajoutant la lecture de types primitifs à l’aide de xxx readXxx() classjava.io.LineNumberInputStream // filtre gérant le numéro de la ligne courante classjava.io.PushbackInputStream // filtre ajoutant la capacité de lecture arrière classjava.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants) // désérialisation d’objets classjava.io.PipedInputStream // InputStream connecté à un OutputStream classjava.io.SequenceInputStream // concaténation de plusieurs InputStream classjava.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. Cours JAVA / Y.Laborde
abstract InputStream Classe de base pour les FBE méthodes int read (int b), int read (byte[] b), void close () long skip (long n), int available(), void reset(), ... IOException FileInputStream FBE associé à un fichier (existant) constructeurs FileNotFoundException SecurityException FileInputStream (File file), ... FileInputStream (String fileName), ... abstract FilterInputStream Classe de base pour les filtres (encapsulation de FBE) DataInputStream Filtre permettant la lecture de types primitifs (encapsulation de FBE) constructeurs DataInputStream (InputStream in) IOException EOFException méthodes xxx readXxx () où Xxx = Boolean, Byte, ... final String readUTF () codage unicode void readFully (byte[] b), ... BufferedInputStream Filtre permettant l’utilisation d’un tampon (encapsulation de FBE) constructeurs BufferedInputStream (InputStream in), ... Java : Les flux binaires d’entrée (FBE) Principales fonctionnalités de FBE pour la lecture de fichier Cours JAVA / Y.Laborde
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. Cours JAVA / Y.Laborde
Java : Les flux textes (FTS & FTE) classjava.lang.Object Hiérarchie de classes (FTS) ___________________________________ Flux de caractères Writer _____________________________________ classjava.io.Writer // abstract class classjava.io.BufferedWriter // filtre pour ajouter un tampon d’écriture classjava.io.CharArrayWriter // écriture dans un tableau en mémoire classjava.io.FilterWriter // abstract class (aucune sous classe dans l’API Java) classjava.io.OutputStreamWriter // conversion de flux de caractères en flux de bytes classjava.io.FileWriter // écriture dans un fichier à l’aide write(…) classjava.io.PipedWriter // OutputStream connecté à un InputStream classjava.io.PrintWriter // filtre ajoutant l’écriture de types primitifs à l’aide de write(…), print(…) et println(…) classjava.io.StringWriter // écriture dans un string buffer prêt à être converti en String classjava.lang.Object Hiérarchie de classes (FTE) _________________________________ Flux de caractères Reader _____________________________________ classjava.io.Reader // abstract class classjava.io.BufferedReader // filtre pour ajouter un tampon de lecture à l’aide de int read() et String readLine() classjava.io.LineNumberReader // filtre gérant le numéro de la ligne courante classjava.io.CharArrayReader // lecture depuis un tableau en mémoire classjava.io.FilterReader // abstract class classjava.io.PushbackReader // filtre ajoutant la capacité de lecture arrière classjava.io.InputStreamReader // conversion de flux de bytes en flux de caractères classjava.io.FileReader // lecture depuis un fichier à l’aide de int read() classjava.io.PipedReader // InputStream connecté à un OutputStream classjava.io.StringReader // flux de lecture depuis un String Cours JAVA / Y.Laborde
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. Cours JAVA / Y.Laborde
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. Cours JAVA / Y.Laborde
Java : Hiérarchie du package "java.io" Hiérarchie de classes (1) classjava.lang.Object _________________________________ File & FileDescriptor _______________________________________ classjava.io.File (implements java.lang.Comparable, java.io.Serializable) classjava.io.FileDescriptor ___________________________________ Flux d’entrée InputStream _________________________________ class java.io.InputStream classjava.io.ByteArrayInputStream classjava.io.FileInputStream classjava.io.FilterInputStream classjava.io.BufferedInputStream classjava.io.DataInputStream (implements java.io.DataInput) classjava.io.LineNumberInputStream classjava.io.PushbackInputStream classjava.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants) classjava.io.PipedInputStream classjava.io.SequenceInputStream classjava.io.StringBufferInputStream ___________________________________ Flux de sortie OutputStream _______________________________ classjava.io.OutputStream classjava.io.ByteArrayOutputStream classjava.io.FileOutputStream classjava.io.FilterOutputStream classjava.io.BufferedOutputStream classjava.io.DataOutputStream (implements java.io.DataOutput) classjava.io.PrintStream classjava.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants) classjava.io.PipedOutputStream Cours JAVA / Y.Laborde
Java : Hiérarchie du package "java.io" Hiérarchie de classes (2) classjava.lang.Object _________________________________ Flux de caractères Reader _____________________________________ classjava.io.Reader classjava.io.BufferedReader classjava.io.LineNumberReader classjava.io.CharArrayReader classjava.io.FilterReader classjava.io.PushbackReader classjava.io.InputStreamReader classjava.io.FileReader classjava.io.PipedReader classjava.io.StringReader ___________________________________ Flux de caractères Writer _____________________________________ classjava.io.Writer classjava.io.BufferedWriter classjava.io.CharArrayWriter classjava.io.FilterWriter classjava.io.OutputStreamWriter classjava.io.FileWriter classjava.io.PipedWriter classjava.io.PrintWriter classjava.io.StringWriter ____________________________ Flux d’analyse grammaticale StreamTokenizer ______________________ classjava.io.StreamTokenizer Cours JAVA / Y.Laborde
Java : Hiérarchie du package "java.io" Hiérarchie de classes (3) classjava.lang.Object ______________________________ Flux de fichier à accès direct __________________________________ classjava.io.RandomAccessFile (implements java.io.DataInput, java.io.DataOutput) _________________________________ Flux pour objets _________________________________________ (class java.io.InputStream) classjava.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants) classjava.io.ObjectInputStream.GetField (classjava.io.OutputStream) classjava.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants) classjava.io.ObjectOutputStream.PutField classjava.io.ObjectStreamClass (implements java.io.Serializable) classjava.io.ObjectStreamField (implements java.lang.Comparable) _________________________________ Securité & Permission ____________________________________ classjava.security.Permission (implements java.security.Guard, java.io.Serializable) classjava.security.BasicPermission (implements java.io.Serializable) classjava.io.SerializablePermission classjava.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). Cours JAVA / Y.Laborde