15
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 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)

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

Embed Size (px)

Citation preview

Page 1: 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

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

Page 2: 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

2

Cours JAVA / Y.Laborde

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

Java : Flux / Introduction

Définition : Un flux est un canal permettant de faire transiter de l’information sous forme d’une suite d’octets.

FLUXde SORTIE

d’ ENTRÉE Flux en lecture (délivrant de l’information)

Flux en écriture (recevant de l’information)

FLUXTEXTE

BINAIRE L’information transite sans aucune modification

L’information qui transite subit une transformation (formatage) sous forme de suite

de caractères

…selon le sens :

…selon le mode :

D’autre part, les flux sont particularisés…

Page 3: 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

3

Cours JAVA / Y.Laborde

Java : Flux / Introduction

Différence entre flux BINAIRE et flux TEXTESoit 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).

Page 4: 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

4

Cours JAVA / Y.Laborde

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.

class java.lang.Object Hiérarchie de classes (FBS)______________________________________ Flux de sortie OutputStream _____________________________________

  class java.io.OutputStream // abstract classclass java.io.ByteArrayOutputStream // écriture dans un tableau en mémoireclass java.io.FileOutputStream // écriture dans un fichierclass java.io.FilterOutputStream // abstract class

class java.io.BufferedOutputStream // filtre ajoutant un tampon d’écritureclass 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 fichierclass java.io.PipedOutputStream // OutputStream connecté à un InputStream

valeurs de type primitif

octets

objets

FBS

en fichier

en mémoire

au travers d’une socket

vers un périphérique de communication

Java : Les flux binaires de sortie (FBS)

Page 5: 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

5

Cours JAVA / Y.Laborde

Java : Les flux binaires de sortie (FBS)Principales fonctionnalités de FBS pour l’écriture en fichier

IOException

FileNotFoundExceptionSecurityException

FileOutputStream (File file), ...FileOutputStream (String fileName), ...

constructeurs

Classe de base pour les FBSOutputStreamabstract

DataOutputStream (OutputStream out)

constructeurs

FBS associé à un fichier (nouveau, détruit ou ajout)FileOutputStream

Classe de base pour les filtres (encapsulation de FBS)FilterOutputStreamabstract

IOExceptionvoid 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 l’utilisation d’un tampon (encapsulation de FBS)BufferedOutputStream

Filtre permettant l’écriture de types primitifs (encapsulation de FBS)DataOutputStream

Page 6: 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

6

Cours JAVA / Y.Laborde

Java : Les flux binaires de sortie (FBS)

1) // FBS simpleFileOutputStream fbs1 = new FileOutputStream("myData.dat");

2) // FBS pour types primitifsDataOutputStream 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 FileFile 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.

Exemples de FBS pour l’écriture en fichier

Page 7: 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

7

Cours JAVA / Y.Laborde

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.

class java.lang.Object Hiérarchie de classes (FBE)______________________________________ Flux d’entrée InputStream _____________________________________

  class java.io.InputStream // abstract classclass java.io.ByteArrayInputStream // lecture depuis un tableau en mémoireclass java.io.FileInputStream // lecture depuis un fichierclass java.io.FilterInputStream // abstract class

class java.io.BufferedInputStream // filtre ajoutant un tampon de lectureclass 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 couranteclass 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 OutputStreamclass java.io.SequenceInputStream // concaténation de plusieurs InputStreamclass 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 d’une socket

depuis un périphérique de communication

Java : Les flux binaires d’entrée (FBE)

Page 8: 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

8

Cours JAVA / Y.Laborde

Java : Les flux binaires d’entrée (FBE)Principales fonctionnalités de FBE pour la lecture de fichier

IOException

FileNotFoundExceptionSecurityException

FileInputStream (File file), ...FileInputStream (String fileName), ...

constructeurs

Classe de base pour les FBEInputStreamabstract

DataInputStream (InputStream in)

constructeurs

FBE associé à un fichier (existant)FileInputStream

Classe de base pour les filtres (encapsulation de FBE)FilterInputStreamabstract

IOExceptionEOFException

xxx readXxx () où Xxx = Boolean, Byte, ...final String readUTF () codage unicodevoid 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 l’utilisation d’un tampon (encapsulation de FBE)BufferedInputStream

Page 9: 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

9

Cours JAVA / Y.Laborde

Java : Les flux binaires d’entrée (FBE)

1) // FBE simpleFileInputStream fbe1 = new FileInputStream("myData.dat");

2) // FBE pour types primitifsDataInputStream fbe2 = new DataInputStream

(new FileInputStream("myData.dat"));

3) // FBE pour types primitifs avec tamponDataInputStream 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 FileFile 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.

Exemples de FBE pour la lecture de fichier

Page 10: 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

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’écritureclass java.io.CharArrayWriter // écriture dans un tableau en mémoireclass 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 InputStreamclass 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

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 à l’aide de int read() et String readLine()

class java.io.LineNumberReader // filtre gérant le numéro de la ligne couranteclass java.io.CharArrayReader // lecture depuis un tableau en mémoireclass java.io.FilterReader // abstract class

class java.io.PushbackReader // filtre ajoutant la capacité de lecture arrièreclass java.io.InputStreamReader // conversion de flux de bytes en flux de caractères

class java.io.FileReader // lecture depuis un fichier à l’aide de int read()class java.io.PipedReader // InputStream connecté à un OutputStreamclass java.io.StringReader // flux de lecture depuis un String

Java : Les flux textes (FTS & FTE)

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

11

Cours JAVA / Y.Laborde

--- 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 tamponPrintWriter 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.

Exemples de FTS pour l’écriture en fichier

Java : Les flux textes de sortie (FTS)

Page 12: 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

12

Cours JAVA / Y.Laborde

--- 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 tamponBufferedReader 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.

Exemples de FTE pour la lecture de fichier

Java : Les flux textes d’entrée (FTE)

Page 13: 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

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 d’entrée InputStream _________________________________

  class java.io.InputStream class java.io.ByteArrayInputStreamclass java.io.FileInputStreamclass java.io.FilterInputStream

class java.io.BufferedInputStreamclass java.io.DataInputStream (implements java.io.DataInput) class java.io.LineNumberInputStreamclass java.io.PushbackInputStream

class java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants) class java.io.PipedInputStreamclass java.io.SequenceInputStreamclass java.io.StringBufferInputStream

___________________________________ Flux de sortie OutputStream _______________________________   class java.io.OutputStream

class java.io.ByteArrayOutputStreamclass java.io.FileOutputStreamclass java.io.FilterOutputStream

class java.io.BufferedOutputStreamclass 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"

Page 14: 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

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.CharArrayReaderclass java.io.FilterReader

class java.io.PushbackReader class java.io.InputStreamReader

class java.io.FileReader class java.io.PipedReaderclass java.io.StringReader

___________________________________ Flux de caractères Writer _____________________________________ class java.io.Writer

class java.io.BufferedWriterclass java.io.CharArrayWriterclass java.io.FilterWriterclass java.io.OutputStreamWriter

class java.io.FileWriter class java.io.PipedWriterclass java.io.PrintWriterclass java.io.StringWriter

____________________________ Flux d’analyse grammaticale StreamTokenizer ______________________ class java.io.StreamTokenizer

Java : Hiérarchie du package "java.io"

Page 15: 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

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 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).