1 Cours JAVA / Y.Laborde Java : Les FLUX de données Les flux de données introduction les flux...
-
Upload
remy-monnier -
Category
Documents
-
view
112 -
download
0
Transcript of 1 Cours JAVA / Y.Laborde Java : Les FLUX de données Les flux de données introduction les flux...
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)
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…
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).
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)
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
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
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)
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
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
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)
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)
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)
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"
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"
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).