API d’entr´ees/sorties de Java Comment utiliser l’API S´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 S´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 S´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 S´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 s´erialisation.
Ce m´ecanisme repose sur l’API d’entr´ees/sorties de Java.
Christophe Garion IN328 1 - Entr´ees/sorties 23/ 35