Plan API d`entrées/sorties de Java Les classes disponibles

IN328 Programmation distribu´ee avec Java et J2EE
1 - Entr´ees/sorties et s´erialisation en Java
Christophe Garion
ISAE/DMIA - SUPAERO/IN
10 avenue ´
Edouard Belin
31055 Toulouse Cedex 4
Christophe Garion IN328 1 - Entr´ees/sorties 1/ 35
Plan
1API d’entr´ees/sorties de Java
2Comment utiliser l’API
3erialiser un objet
4Le paquetage java.nio
Christophe Garion IN328 1 - Entr´ees/sorties 2/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
API d’entr´ees/sorties de Java
On manipule des flux (streams) qui ont soit une source (input streams)
ou une destination (output streams).
Source Programme
01011101 01001111
Programme Destination
01011101 01001111
On lit ou en envoie un ´el´ement `a la fois.
Deux grandes parties parmi ces flux : flux de caract`eres (texte) et flux
d’octets (binaire).
Toutes les classes n´ecessaires appartiennent au paquetage java.io.
Christophe Garion IN328 1 - Entr´ees/sorties 4/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Les classes disponibles
Quatre grandes classes abstraites :
caract`eres octets
entr´ees Reader InputStream
sorties Writer OutputStream
caract`eres : sur 16 bits, donc Unicode possible ;
octets : sur 8 bits, donc Latin1 seulement.
Un m´ecanisme d’exception : IOException (`a utiliser tout le temps :
fermeture de fichiers etc).
Les classes r´eelles appartiennent `a une hi´erarchie de classes sp´ecialis´ees
(voir la documentation sur http://java.sun.com).
Christophe Garion IN328 1 - Entr´ees/sorties 5/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Les classes de flux d’octets
InputStream :
public abstract int read() throws IOException
public int read(byte[] buf, int offset, int count)
throws IOException
public long skip(long count) throws IOException
public void close() throws IOException
OutputStream :
public abstract void write(int b) throws IOException
public void write(byte[] buf, int offset, int count)
throws IOException
public void flush()
public void close() throws IOException
Christophe Garion IN328 1 - Entr´ees/sorties 6/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Flux d’octets : exemple
public static void io(InputStream in, OutputStream out)
throws IOException {
try {
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
Importance de la fermeture des flux dans la clause finally.
Christophe Garion IN328 1 - Entr´ees/sorties 7/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Les classes de flux de caract`eres
Reader :
public int read() throws IOException
public abstract int read(char[] buf, int offset,
int count) throws IOException
public long skip(long count) throws IOException
public void close() throws IOException
Writer :
public void write(int ch) throws IOException
public abstract void write(char[] buf, int offset,
int count) throws IOException ;
public void flush() ;
public void close() throws IOException.
Christophe Garion IN328 1 - Entr´ees/sorties 8/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Conversion de flux
System.in,System.out et System.err sont des flux d’octets et non
pas de donn´ees. Or on veut souvent r´ecup´erer des donn´ees encoees de
fa¸con particuli`ere.
On dispose de deux classes permettant de convertir :
un InputStream vers un Reader, il s’agit de InputStreamReader
un Writer vers un OutputStream, il s’agit de OutputStreamWriter
On peut choisir le charset du flux en utilisant la classe
java.nio.Charset.
Ceci peut ´egalement servir pour travailler plus facilement avec des
sockets par exemple.
Exemple :
Reader r = new InputStreamReader(System.in);
Dans l’autre sens, il faut se d´ebrouiller avec DataOutputStream...
Christophe Garion IN328 1 - Entr´ees/sorties 10/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Flux de bases
Les quatre classes abstraites de base sont sp´ecialis´ees dans diff´erentes
classes concr`etes suivant la source ou la destination du flux :
fichier (quatre classes commen¸cant par File)
flux bufferis´es (quatre classes commen¸cant par Buffered)
pipes (quatre classes commen¸cant par Piped)
PrintWriter et PrintStream pour ´ecrire des types primitifs
On peut ´egalement ajouter :
ObjectOutputStream et ObjectInputStream (cf. plus loin)
ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,
CharArrayWriter pour travailler avec des flux vers/depuis des tableaux
StringReader et StringWriter pour avoir des flux depuis/vers une
chaˆıne de caract`eres
LineNumberReader,SequenceInputStream (concat´enation de flux),
PushbackInputStream et PushbackReader
Christophe Garion IN328 1 - Entr´ees/sorties 11/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Flux vers et depuis des fichiers
On utilise FileInputStream,FileOutputStream,FileReader et
FileWriter.
Les constructeurs de ces classes peuvent prendre en param`etre une chaˆıne
de caract`eres qui est le nom du fichier, un objet de type File ou un objet
de type FileDescriptor.
Exemple :
File inputFile = new File("in.txt");
File outputFile = new File("out.txt");
FileReader in = new FileReader(inputFile);
FileWriter out = new FileWriter(outputFile);
int c;
while ((c = in.read()) != -1)
out.write(c);
in.close();
out.close();
Attention aux exceptions !
Christophe Garion IN328 1 - Entr´ees/sorties 12/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Flux «bufferis´es »
Les flux que nous avons vus ne sont pas efficaces : chaque op´eration de
lecture ou d’´ecriture d’octet ou de caract`ere est faite par l’OS !
On peut «bufferiser »les flux pour plus d’efficacit´e via BufferedReader,
BufferedWriter,BufferedInputStream et BufferedOutputStream.
Les appels `a l’API native ne se font que lorsque le buffer est plein ou vide
selon l’utilisation.
Exemple :
BufferedReader entreeClavier = new BufferedReader(
new InputStreamReader(System.in));
String l = entreeClavier.readLine();
On peut forcer l’´ecriture du flux via la m´ethode flush. L’autoflush est
disponible via le constructeur du flux.
Christophe Garion IN328 1 - Entr´ees/sorties 13/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Pipes et flux filtr´es
On peut utiliser des objets de type PipedReader,PipedWriter,
PipedInputStream et PipedOutputStream permettent d’avoir des
pipes entre deux flux.
Un buffer interne est cr´e et maintenu par le pipe et on peut lire et ´ecrire
dans les flux.
La seule fa¸con sˆure de s’en servir est d’utiliser deux threads diff´erents
(un de chaque cˆot´e du pipe).
On se sert d’un des flux comme param`etre du constructeur de l’autre
pour lier les deux flux via le pipe.
Christophe Garion IN328 1 - Entr´ees/sorties 14/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Flux de type Print
Les flux de type Print,PrintStream et PrintWriter, permettent
facilement d’´ecrire les valeurs des types primitifs de Java et des objets
(Object et String).
On a acc`es `a trois m´ethodes principales :
print
println qui ajoute un s´eparateur de ligne
format qui permet d’utiliser un format comme en C :
int i = 2;
double r = Math.sqrt(i);
System.out.format("La racine carree de %d est %f.%n", i, r);
Attention, les seuls PrintStream utilis´es sont System.out et
System.err (c’est pour cela que l’on peut ´ecrire facilement sans se
soucier de l’encodage sur la sortie standard !).
Christophe Garion IN328 1 - Entr´ees/sorties 15/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Ajout de sp´ecificit´es aux flux
Comment changer le comportement d’un flux ? Par exemple :
crypter/d´ecrypter un flux `a la vol´ee
construire un checksum d’un flux
. . .
Si l’on doit sp´ecialiser les classes de base, on se retrouve avec un (trop !)
grand nombre de classes :
CypheredFileInputStream
CypheredPipedInpuEtream
. . .
Christophe Garion IN328 1 - Entr´ees/sorties 16/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Pattern d´ecorateur
Utilisation d’un design pattern, le d´ecorateur. Il permet de changer
dynamiquement le comportement d’un objet.
Decorator
+ operation()
Component
+ operation()
ConcreteDecoratorBConcreteDecoratorA
+ operation()
+ otherOperation() + operation()
− otherAttribute
− theComponent
code:
theComponent.operation()
+ operation()
ConcreteComponent
Christophe Garion IN328 1 - Entr´ees/sorties 17/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Pattern d´ecorateur
opération()
: Test
comp : ConcreteComponent
dec : ConcreteDecoratorA
« create » (comp)
« create »
opération()
Christophe Garion IN328 1 - Entr´ees/sorties 18/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
D´ecorateur : application aux flux
On a quatre classes abstraites permettant de d´ecorer les flux :
FilterInputStream,FilterOutputStream,FilterReader,
FilterWriter.
Quelques sous-classes :
BufferedInputStream et BufferedOutputStream
PushbackInputStream et PushbackReader
PrintStream
DataInputStream et DataOutputStream (important, ils permettent de
lire et d’´ecrire des types primitifs dans des flux d’octets)
CipherInputStream et CipherOutputStream
CheckedInputStream et CheckedOutputStream
Christophe Garion IN328 1 - Entr´ees/sorties 19/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Exemple d’utilisation
public static final void main(final String[] args) throws IOException {
CheckedInputStream check = new CheckedInputStream(System.in,
new CRC32());
InputStreamReader in = new InputStreamReader(check);
BufferedReader buf = new BufferedReader(in);
String s = buf.readLine();
System.out.println("La chaine " + s + " a pour checksum " +
check.getChecksum().getValue());
}
/home/tof/.../% java EssaiCheckReader
coucou
La chaine coucou a pour checksum 925363051
On utilise beaucoup ce m´ecanisme pour modifier le comportement des
flux. On peut ´egalement red´efinir ses propres filtres.
Christophe Garion IN328 1 - Entr´ees/sorties 20/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Analyser une entr´ee
Un objet de type java.util.Scanner permet de d´ecomposer un flux en
tokens :
Scanner s = new Scanner("Une chaine 1 2 3");
while (s.hasNext()) {
System.out.println(s.next());
}
On peut ´egalement utiliser le type des tokens avec des m´ethodes comme
nextInt(),nextDouble()...
Enfin, on peut utiliser des expressions r´eguli`eres complexes (cf. le
paquetage java.util.regex) :
Scanner s = new Scanner("Le chat est un animal a 4 pattes " +
"et 2 oreilles");
s.findInLine("Le (\\w+) est un animal a (\\d+) pattes" +
" et (\\d+) oreilles");
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(result.group(i));
Christophe Garion IN328 1 - Entr´ees/sorties 21/ 35
API d’entr´ees/sorties de Java Comment utiliser l’API erialiser un objet Le paquetage java.nio
Probl`eme de la s´erialisation
Un objet est caract´eris´e par son nom, son ´etat et son comportement.
Le comportement de l’objet est d´ecrit dans une classe. Un objet peut ˆetre
de plusieurs types (r´ealisation, h´eritage), mais c’est une classe unique qui
va d´efinir son comportement.
Ce comportement est donc conserv´e via le bytecode produit par le
compilateur.
Qu’en est-il de l’´etat d’un objet ? Il n’y a pas de moyen a priori de
sauvegarder l’´etat d’un objet particulier.
Java propose un m´ecanisme pour cela : la erialisation.
Ce m´ecanisme repose sur l’API d’entr´ees/sorties de Java.
Christophe Garion IN328 1 - Entr´ees/sorties 23/ 35
1 / 8 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !