• Aucun résultat trouvé

cm06-io.pdf — April 27, 2005 — 1

N/A
N/A
Protected

Academic year: 2021

Partager "cm06-io.pdf — April 27, 2005 — 1"

Copied!
8
0
0

Texte intégral

(1)

as

Architecture des Systèmes d’Information

Pr´esentation Flux octet Flux caract`ere S´erialisation

Programmation

- Gestion des entr´ ees / sorties -

Nicolas Malandain

April 27, 2005

Gestion des entr´ees / sorties 1 / 29

as

Architecture des Systèmes d’Information

Pr´esentation Flux octet Flux caract`ere S´erialisation

1

Pr´ esentation Flux

Types de flux

Homog´ en´ eit´ e des classes de base

2

Flux octet Pr´ esentation Description Exemples

3

Flux caract` ere Pr´ esentation Description Exemples

4

S´ erialisation Pr´ esentation Ecriture/Lecture ´ Contrˆ ole

Gestion des entr´ees / sorties 2 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Flux Types de flux Homog´en´eit´e des classes de base

Principe des flux

Source

Programme données

Destination Programme

données

flux

lecture

écriture

Remarques

Source/Destination : “programme”, fichier (texte, binaire), BD, . . . ind´ ependance vis ` a vis du type des donn´ ees

un flux est unidirectionnel

les m´ ethodes d’acc` es aux flux sont identiques

Pr´esentation Flux octet Flux caract`ere S´erialisation Flux Types de flux Homog´en´eit´e des classes de base

Deux types de flux

API des flux dans le package java.io

Flux orient´ es octet (binaire)

manipulation d’informations binaires sur 8 bits

`

a utiliser pour lire/´ ecrire des images, sons, ...

Flux orient´ es caract` ere (texte)

manipulation d’informations de type caract` ere sur 16bits (unicode)

`

a utiliser pour lire/´ ecrire du texte

Remarque

Pour l’acc` es ` a des fichiers sur disque, les flots bufferis´ es sont fortement

conseill´ es (cf. transparents suivants).

(2)

Pr´esentation Flux octet Flux caract`ere S´erialisation Flux Types de flux Homog´en´eit´e des classes de base

Flux de lecture

InputStream classe m` ere de l’API orient´ e octet int read()

int read(byte cbuf[])

int read(byte cbuf[], int offset, int length)

Reader classe m` ere de l’API orient´ e caract` ere int read()

int read(char cbuf[])

int read(char cbuf[], int offset, int length)

Gestion des entr´ees / sorties 5 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Flux Types de flux Homog´en´eit´e des classes de base

Flux d’´ ecriture

OutputStream classe m` ere de l’API orient´ e octet int write(int c)

int write(byte cbuf[])

int write(byte cbuf[], int offset, int length)

Writer classe m` ere de l’API orient´ e caract` ere int write(int c)

int write(char cbuf[])

int write(char cbuf[], int offset, int length)

Gestion des entr´ees / sorties 6 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

Hi´ erarchie des classes

FileInputStream PipedInputStream

FilterInputStream ByteArrayInputStream SequenceInputStream ObjectInputStream InputStream

LineNumberInputStream DataInputStream BufferedInputStream PushbackInputStream

FileOutputStream PipedOutputStream FilterOutputStream ByteArrayOutputStream

ObjectOutputStream OutputStream

DataOutputStream BufferedOutputStream

PrintStream

En gris les classes li´ es ` a des conteneurs de donn´ ees En blanc les classes li´ es ` a des traitements des donn´ ees

Gestion des entr´ees / sorties 7 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

Classes en lecture

Conteneurs de donn´ ees

FileInputStream lecture de fichiers (octet par octet) PipedInputStream lecture des donn´ ees venant d’un

PipedOutputStream

ByteArrayInputStream lecture de donn´ ees dans un tampon d’octets (tableau) en m´ emoire

Traitement de donn´ ees

SequenceInputStream concat´ enation de flux en un seul

ObjectInputStream lecture d’objets (d´ es´ erialisation d’objets java) FilterInputStream lecture en modifiant certaines donn´ ees

(num´ erotation, conversions de donn´ ees, bufferisation, vue en avant, . . . )

Gestion des entr´ees / sorties 8 / 29

(3)

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

Classes en ´ ecriture

Conteneurs de donn´ ees

FileOutputStream ´ ecriture de fichiers (octet par octet) PipedOutputStream ´ ecriture dans un flux lu par un

PipedInputStream

ByteArrayOutputStream ´ ecriture de donn´ ees dans un tampon d’octets (tableau) en m´ emoire

Traitement de donn´ ees

ObjectOutputStream ´ ecriture d’objets (s´ erialisation d’objets java) FilterOutputStream ´ ecriture en modifiant certaines donn´ ees

(conversions de donn´ ees, bufferisation, facilit´ e d’affichage/formatage, . . . )

Gestion des entr´ees / sorties 9 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

Les flux standards

Les 3 flux standards

Attributs de classe de System (java.util) System.in entr´ ee standard (InputStream) System.out sortie standard (PrintStream)

System.err sortie d’erreur standard (PrintStream)

System.out / PrintStream

PrintStream h´ erite de FilterOutputStream

Fonctionnalit´ es suppl´ ementaires de PrintStream : surcharges de print et println pour ´ ecrire des String, byte, int, char, float, ...

System.in / InputStream

InputStream lit uniquement des octets. N´ ecessit´ e d’une couche sup´ erieure pour “d´ ecoder” les octets lus, depuis Java 5 ⇒ Scanner

Gestion des entr´ees / sorties 10 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

TestFluxOctet.java

Scanner sc1 =new Scanner(System.in);

int nbentier;

doublenbdouble;

DataOutputStream dos =newDataOutputStream(newFileOutputStream("fichierbinaire"));

do{

System.out.print("Entier ? ");

nbentier = sc1.nextInt();

System.out.print("Double ? ");

nbdouble = sc1.nextDouble();

dos.writeInt(nbentier);

dos.writeDouble(nbdouble);

System.out.println("Continuer ? O/N");

}while(sc1.next("[oOnN]").toUpperCase().equals("O"));

dos.close();

DataInputStream dis =newDataInputStream(newBufferedInputStream(

new FileInputStream(new File("fichierbinaire"))));

while (dis.available()!=0) {

System.out.println("entier lu : "+dis.readInt());

System.out.println("double lu : "+dis.readDouble());

}

dis.close();

Scanner sc2 =new Scanner(args[0]).useDelimiter("[\\s\\-]+");

int nbentier2 = sc2.nextInt();

doublenbdouble2 = sc2.nextDouble();

System.out.printf("entier : %d,double : %.2f ",nbentier2,nbdouble2);

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

Hi´ erarchie des classes

BufferedReader CharArrayReader InputStreamReader

FilterReader PipedReader StringReader Reader

LineNumberReader

FileReader PushbackReader

BufferedWriter CharArrayWriter OutputStreamWriter

FilterWriter PipedWriter PrintWriter StringWriter Writer

FileWriter

En gris les classes li´ es ` a des conteneurs de donn´ ees

En blanc les classes li´ es ` a des traitements des donn´ ees

(4)

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

Classes en lecture

Conteneurs de donn´ ees

CharArrayReader lecture de caract` eres dans un tampon d’octets (tableau) en m´ emoire

FileReader lecture de caract` eres dans un fichier texte PipedReader lecture de caract` eres venant d’un PipedWriter StringReader lecture de caract` eres ` a partir d’une String

Traitement de donn´ ees

BufferedReader bufferisation de la lecture d’un flux caract` ere InputStreamReader conversion de flux octet en flux caract` ere

FilterReader lecture en modifiant certain caract` eres (vue en avant, . . . )

Gestion des entr´ees / sorties 13 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

Classes en ´ ecriture

Conteneurs de donn´ ees

CharArrayWriter ´ ecriture de caract` eres dans un tampon d’octets (tableau) en m´ emoire

FileWriter ´ ecriture de caract` eres dans un fichier texte PipedWriter ´ ecriture de caract` eres dans un flux lu par un

PipedReader

StringWriter ´ ecriture de carac` eres dans une String

Traitement de donn´ ees

BufferedWriter bufferisation de l’´ ecriture dans un flux caract` ere OutputStreamWriter conversion de flux caract` ere en flux octet

FilterWriter ´ ecriture en modifiant certains caract` eres PrintWriter ´ ecriture avec facilit´ e de formatage

Gestion des entr´ees / sorties 14 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Description Exemples

TestFluxCaractere.java

public static voidmain(String[] args)throwsIOException { Reader reader =new BufferedReader(new FileReader(args[0]));

Writer writer =new BufferedWriter(new FileWriter(args[1]));

PrintWriter pwriter =newPrintWriter(System.out);

int c;

while ( (c = reader.read()) != -1) { pwriter.write(c);

writer.write(c);

}

pwriter.flush();

reader.close();

writer.close();

}

Gestion des entr´ees / sorties 15 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Ecriture/Lecture Contrˆ´ ole

Principe de la s´ erialisation

S´ erialisation

Permet l’envoi d’objets ` a travers des flux, notamment des flux de fichiers permettant ainsi la persistance.

En java

La s´ erialisation d’objets est notamment apparu dans Java en support ` a la technique Remote Method Invocation.

tout objet impl´ ementant l’interface Serializable est s´ erialisable en une suite d’octets, qui pourra ˆ etre relue pour reconstruire l’objet.

Java prend en charge la s´ erialisation des r´ eseaux d’objets (tableaux d’objets, objets d’objets, ...)

la s´ erialisation est ind´ ependante de la plateforme

ni les attributs transient, ni les static ne sont s´ erialis´ es

`

a la d´ es´ erialisation les constructeurs ne sont pas utilis´ es

Gestion des entr´ees / sorties 16 / 29

(5)

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Flots de s´ erialisation

ObjectOutputStream / ObjectInputStream

Ces deux flots permettent l’´ ecriture d’objets dans des flots, mais aussi les types simples

writeObject / readObject writeInt / readInt . . .

Faire qu’un objet soit s´ erialisable

La classe doit impl´ ementer l’interface Serializable qui ne contient aucune m´ ethode.

Gestion des entr´ees / sorties 17 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Ecriture/Lecture´ Contrˆole

Exemple 1

ExempleSerialisationObjetsEcriture.java

FileOutputStream fichier =new FileOutputStream(args[0]);

ObjectOutputStream flotObjets =newObjectOutputStream(fichier);

flotObjets.writeObject("La r´eponse `a la question ultime de la vie, de l’univers et de toutes choses est ");

flotObjets.writeInt(42);

flotObjets.flush();

ExempleSerialisationObjetsLecture.java

FileInputStream fichier =newFileInputStream(args[0]);

ObjectInputStream flotObjets =new ObjectInputStream(fichier);

try {

String question = (String)flotObjets.readObject();

int reponse = flotObjets.readInt();

System.out.println(question+reponse);

}catch(ClassNotFoundException e) {

System.err.println("Impossible de trouver la classe de l’objet que vous tentez de d´es´erialiser");

e.printStackTrace();

}

Gestion des entr´ees / sorties 18 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Exemple 2

ObjetTest.java

public class ObjetTestimplementsSerializable { private StringBuilder chaine;

private int nombre;

public ObjetTest(StringBuilder chaine,intnombre) { this.chaine = chaine;

this.nombre = nombre;

}

public String toString() {

return"["+super.toString()+"]("+chaine+"---"+nombre+")";

}

public StringBuilder getChaine() { returnchaine;

} }

TestsSerialisation.java (...)

StringBuilder chaine =new StringBuilder("La cha^ıne Lassie");

ObjetTest[] objTest, objTest1, objTest2, objTest3;

objTest =new ObjetTest[2];

objTest[0] =new ObjetTest(chaine,1);

objTest[1] =new ObjetTest(chaine,2);

System.out.println("objTest -> "+objTest + Arrays.toString(objTest));

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation Ecriture/Lecture´ Contrˆole

TestsSerialisation.java (...)

// s´erialisation

ObjectOutputStream oos1 =new ObjectOutputStream(new FileOutputStream("/tmp/fichier1"));

oos1.writeObject(objTest);

oos1.writeObject(objTest);

oos1.close();

ObjectOutputStream oos2 =new ObjectOutputStream(new FileOutputStream("/tmp/fichier2"));

oos2.writeObject(objTest);

oos2.close();

// d´es´erialisation

ObjectInputStream ois1 =new ObjectInputStream(new FileInputStream("/tmp/fichier1"));

objTest1 = (ObjetTest[])ois1.readObject();

objTest1[0].getChaine().replace(3,9,"chienne");

objTest2 = (ObjetTest[])ois1.readObject();

System.out.println("objTest 1 -> "+objTest1 + Arrays.toString(objTest1));

System.out.println("objTest 2 -> "+objTest2 + Arrays.toString(objTest2));

ois1.close();

ObjectInputStream ois2 =new ObjectInputStream(new FileInputStream("/tmp/fichier2"));

objTest3 = (ObjetTest[])ois2.readObject();

System.out.println("objTest 3 -> "+objTest3 + Arrays.toString(objTest3));

ois2.close();

(6)

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Ex´ ecution

objTest -> ObjetTest;@7d772e[[ObjetTest@11b86e7](La cha^ıne Lassie---1), [ObjetTest@35ce36](La cha^ıne Lassie---2)]

objTest1 -> ObjetTest;@89ae9e[[ObjetTest@1270b73](La chienne Lassie---1), [ObjetTest@60aeb0](La chienne Lassie---2)]

objTest2 -> ObjetTest;@89ae9e[[ObjetTest@1270b73](La chienne Lassie---1), [ObjetTest@60aeb0](La chienne Lassie---2)]

// le stockage d’un reseau d’objets doit ^etre fait dans un m^eme flux // sinon il y a duplications d’objets

objTest3 -> ObjetTest;@16caf43[[ObjetTest@66848c](La cha^ıne Lassie---1), [ObjetTest@8813f2](La cha^ıne Lassie---2)]

Gestion des entr´ees / sorties 21 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Non s´ erialisation d’attributs

transient

ce mot cl´ e associ´ e ` a un attribut sp´ ecifie que ce dernier ne doit pas ˆ etre s´ erialis´ e

Utilisation

Peut ˆ etre utilis´ e notamment lorsque la s´ ecurit´ e est importante, exemple : ne pas s´ erialiser un mot de passe ⇒ transient

Gestion des entr´ees / sorties 22 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Personnaliser la s´ erialisation

Objectif

Modifier le comportement de base de la s´ erialisation

Technique

Impl´ ementer Serializable et ajouter les m´ ethodes suivantes :

private void writeObject(ObjectOutputStream s) throwsIOException { s.defaultWriteObject();// pour le comportement par d´efaut // code

}

private void readObject(ObjectInputStream s) throws IOException { s.defaultReadObject();// pour le comportement par d´efaut // code

}

Gestion des entr´ees / sorties 23 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Exemple

ObjetTestSerializablePerso.java

public class ObjetTestSerializablePersoimplementsSerializable { private String login;

private transient String password;

public ObjetTestSerializablePerso(String login, String password) { this.login = login;

this.password = password;

}

private voidwriteObject(ObjectOutputStream out)throwsIOException { out.defaultWriteObject();

out.writeObject(crypte(password));

}

private voidreadObject(ObjectInputStream in)throwsIOException, ClassNotFoundException { in.defaultReadObject();

password=crypte((String)in.readObject());

}

private String crypte(String chaine) {

return newStringBuilder(chaine).reverse().toString();

}

public String toString() {

return"login : "+login+" / password : "+password;

} }

Gestion des entr´ees / sorties 24 / 29

(7)

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

TestSerializablePerso.java

public static voidmain(String[] args)throwsException {

ObjetTestSerializablePerso otsp =new ObjetTestSerializablePerso("nicolas","motdepasse");

System.out.println(otsp);

ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream("/tmp/fichier"));

oos.writeObject(otsp);

oos.close();

ObjectInputStream ois =new ObjectInputStream(new FileInputStream("/tmp/fichier"));

otsp = (ObjetTestSerializablePerso)ois.readObject();

System.out.println(otsp);

ois.close();

}

Ex´ ecution

login : nicolas / password : motdepasse login : nicolas / password : motdepasse

/tmp/fichier

$ strings /tmp/fichier

7fr.insarouen.asi.prog.cours6.ObjetTestSerializablePersoL logint

Ljava/lang/String;xpt nicolast

essapedtomx

Gestion des entr´ees / sorties 25 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Contrˆ oler totalement la s´ erialisation : Externalizable

Principe

la s´ erialisation standard stocke des informations sur l’objet (les donn´ ees mais aussi des m´ eta-donn´ ees : version de la classe, nom et type des attributs, . . . ) ce qui prend ´ enorm´ ement de temps.

l’impl´ ementation de l’interface Externalizable permet de g´ erer soi-mˆ eme la s´ erialisation

L’interface Externalizable

public interface ExternalizableextendsSerializable { voidwriteExternal(ObjectOutput out)throwsIOException;

voidreadExternal(ObjectInput in)throwsIOException, ClassNotFoundException;

}

Attention

Contrairement ` a la s´ erialisation classique le constructeur par d´ efaut de l’objet d´ es´ erialis´ e est utilis´ e.

Gestion des entr´ees / sorties 26 / 29

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Exemple

ObjetTestExternalizable.java

public class ObjetTestExternalizableimplementsExternalizable { private int nombre;

private int nombreAleatoire;

public ObjetTestExternalizable() { nombreAleatoire = (int)(100*Math.random());

System.err.println("On m’appelle ?");

}

public ObjetTestExternalizable(intnombre) { this();

this.nombre = nombre;

}

public voidwriteExternal(ObjectOutput out)throwsIOException { out.writeInt(nombre);

}

public voidreadExternal(ObjectInput out)throwsIOException,ClassNotFoundException { nombre = out.readInt();

}

public String toString() {

return"["+super.toString()+"]("+nombreAleatoire+"---"+nombre+")";

} }

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

TestSerialisationExternalizable.java

public class TestSerialisationExternalizable {

public static voidmain(String[] args)throwsException {

ObjetTestExternalizable objTestEx1 =new ObjetTestExternalizable(1);

ObjetTestExternalizable objTestEx2 =new ObjetTestExternalizable(2);

System.out.println(objTestEx1);

System.out.println(objTestEx2);

ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream("/tmp/fichier"));

oos.writeObject(objTestEx1);

oos.writeObject(objTestEx1);

oos.writeObject(objTestEx2);

oos.close();

ObjectInputStream ois =new ObjectInputStream(new FileInputStream("/tmp/fichier"));

System.out.println(ois.readObject());

System.out.println(ois.readObject());

System.out.println(ois.readObject());

ois.close();

} }

(8)

Pr´esentation Flux octet Flux caract`ere S´erialisation Pr´esentation ´Ecriture/Lecture Contrˆole

Ex´ ecution

On m’appelle ? On m’appelle ?

[fr.insarouen.asi.prog.cours6.ObjetTestExternalizable@7d772e](47---1) [fr.insarouen.asi.prog.cours6.ObjetTestExternalizable@11b86e7](99---2) On m’appelle ?

[fr.insarouen.asi.prog.cours6.ObjetTestExternalizable@19821f](62---1) [fr.insarouen.asi.prog.cours6.ObjetTestExternalizable@19821f](62---1) On m’appelle ?

[fr.insarouen.asi.prog.cours6.ObjetTestExternalizable@addbf1](85---2)

Gestion des entr´ees / sorties 29 / 29

Références

Documents relatifs

 Les flux de trésorerie d’activité

Cependant, le présent document lui-même ne peut être modifié d’aucune façon, en particulier en retirant la notice de droits de reproduction ou les références à la Internet

On redirige la sortie standard vers le fichier « latotale.txt » puis la sortie des erreurs, représentée par le descripteur « 2 » vers la sortie standard qui

Les sites qui requièrent une authentification par certificat doivent donc être placés dans une liste blanche pour laquelle le déchiffrement n’est pas effectué ; – le niveau

Because changes of water production actually originate at the snow surface and time lapse of percolation from surface to ground is not negligible in a deep snow cover, equation

Lorsqu’avec Marie-Hélène Ratinaud, Xavier Ronot et Geneviève Le Noan-Merdrignac nous avions coédité en 1988 un premier ouvrage en langue française, La Cytométrie en flux

La deuxième édition de La Cytométrie en Flux fait le point, en 29 chapitres, sur toutes les nouveautés dues aux avancées instrumentales, à la miniaturisation des lasers, aux progrès

La diffraction du laser Séparation des signaux Les résultats.?. La cytométrie