Java - Cours 8
Input / Output
Julien Iguchi-Cartigny
Université de Limoges
28 janvier 2010
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 1 / 13
Notion de stream
Idée
Avoir le même modèle de programmation quelque soit :
la source ou la destination
le type des données transportés
Notions
Idée de flux (stream)
représente une séquence de données
directionnel : en entrée (input) ou en sortie (output)
Représentation abstraite vers une multiude de source ou destination :
I fichier
I communication par réseau
I communication entre différent thread
I un tableau en mémoire
I ...
Adaptable pour plusieurs type de données : primitifs ou données complexes
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 2 / 13
Byte Stream I
Présentation
flux de données en 8 bits
en entrée InputStream ou en sortie OutputStream
API [Link]
public abstract class InputStream {
public InputStream () ;
int available () ; // available byte for read without blocking
void close () ;
abstract int read () ; // return character value or -1 if nothing
int read ( byte [] b ) ;
int read ( byte [] b , int off , int len ) ;
long skip ( long n ) ; // skip over and discards n bytes
void reset () ; // reset to mark position (0 if no mark )
void mark () ;
boolean markSupported () ;
}
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 3 / 13
Byte Stream II
API [Link]
public abstract class OutputStream {
public OutputStream () ;
void close () ;
abstract void write ( int b ) ;
void write ( byte [] b ) ;
void write ( byte [] b , int off , int len ) ;
void flush () ;
}
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 4 / 13
Byte Stream III
Exemple
public class CopyBytes {
public static void main ( String [] args ) throws IOException {
InputStream in = null ;
OutputStream out = null ;
try {
in = new FileInput St r ea m ( " xanadu . txt " ) ;
out = new FileOut p u t S t r e a m ( " outagain . txt " ) ;
int c ;
while (( c = in . read () ) != -1) {
out . write ( c ) ;
}
} finally {
if ( in != null ) {
in . close () ;
}
if ( out != null ) {
out . close () ;
}
}
}
}
Source : IO trails ( c Sun Microsystems)
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 5 / 13
Plan
ByteArrayInputStream
FileInputStream InputStream PipedInputStream
FilterInputStream
BufferedInputStream DeflaterInputStream
CipherInputStream InflaterInputStream
DataInputStream
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 6 / 13
Implémentation de sources
ByteArrayInputStream
Flux de lecture sur un tableau d’octets
InputStream is = new ByteArrayInputStream(new byte[200]);
FileInputStream
Flux de lecture à partir d’un fichier
InputStream is = new FileInputStream("[Link]");
PipedInputStream
Connecté à un PipedOutputStream
permet à deux threads de communiquer
OutputStream os = new P i p e d O u t p u t S t r e a m () ;
InputStream is = new P i p e d I n p u t S t r e a m ( os ) ;
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 7 / 13
Notion de filtre I
Besoins
Nécessité d’appliquer des modifications sur un flux :
formatage des données
compression / décompression
opérations cryptographiques (chiffrement, signature)
bufferisation des données
Idée : appliquer une suite de filtre utilisable de la même façon qu’un InputStream
InputStream Filter 1 Filter 2 Filter 3 Client
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 8 / 13
Notion de filtre II
Le pattern Decorator
Les constructeurs des filtres prennent en paramètres la source (ou la
destination) à partir duquel (ou vers lequel) ils vont manipuler le flux
Exemple
Cipher cipher = // initialize somewhere else ...
Fil eI n pu tStre am fis = new F il eI np u tS tr ea m ( " test . zip " ) ;
D e f l a t e r I n p u t S t re a m dis = new D e f l a t e r I n p u t S t r e a m ( fis ) ;
Ci p h e r I n put S tr e am cis = new C i p h e r I n p u t S t r e a m ( is , cipher ) ;
B u f f e r e d I n p u t S t re a m bis = new B u f f e r e d I n p u t S t r e a m ( cis ) ;
InputStream is ( InputStream ) bis ;
// readint with a buffer to the first 100 characters of a compressed and
// encrypted file
byte [] ba = new byte [100];
is . read ( ba ) ;
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 9 / 13
Implémentation de filtres disponibles
BufferedInputStream
Bufferisation des données en entrée (pour éviter un accès à chaque lecture)
CipherInputStream
Déchiffrement ou déchiffrement des données en entrée
DataInputStream
Formatage des données, possibilité de lire les données comme des types primitifs
(int, double, boolean. . . )
InputStream is = // somewhere else
D at aI n pu tStre am dis = new D at aI np u tS tr ea m ( is ) ;
boolean a = dis . readBoolean () ;
int b = dis . readInt () ;
float c = dis . readFloat () ;
InflaterInputStream et DeflaterInputStream
Compression et décompression des données en entrée
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 10 / 13
Flux de charactères
Gestion de l’internatinalisation
Nécessité de gérer des caractères complexes sous un format d’encodage
particulier
exemple : un caractère UTF-8 peut faire une taille de 1 à 4 caractères selon
la langue, mais nous voulons le manipuler comme un char
Nouvel ensemble disponible
Deux nouveaux mécanismes de flux pour les fichiers texte
Reader (équivalence : InputStream)
Writer (équivalence : OutputStream)
il existe des classes passerelles pour transformer un flux Reader (Writer) en un
flux InputStream (OutputStream), et vice-versa.
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 11 / 13
Plan
FilterReader BufferedReader StringReader
Reader
CharArrayReader PipedReader InputStreamReader
J. Iguchi-Cartigny (Univ. Limoges) Java (8) Version 0.1 12 / 13