Académique Documents
Professionnel Documents
Culture Documents
1 Présentation
Flux
Types de flux
Homogénéité des classes de base
Programmation 2 Flux octet
- Gestion des entrées / sorties - Présentation
Description
Exemples
Nicolas Malandain
3 Flux caractère
Présentation
Description
April 27, 2005
Exemples
4 Sérialisation
Présentation
Écriture/Lecture
as
Architecture des Systèmes d’Information
Contrôle as
Architecture des Systèmes d’Information
Présentation Flux octet Flux caractère Sérialisation Flux Types de flux Homogénéité des classes de base Présentation Flux octet Flux caractère Sérialisation Flux Types de flux Homogénéité des classes de base
InputStream classe mère de l’API orienté octet OutputStream classe mère de l’API orienté octet
int read() int write(int c)
int read(byte cbuf[]) int write(byte cbuf[])
int read(byte cbuf[], int offset, int length) int write(byte cbuf[], int offset, int length)
Reader classe mère de l’API orienté caractère Writer classe mère de l’API orienté caractère
int read() int write(int c)
int read(char cbuf[]) int write(char cbuf[])
int read(char cbuf[], int offset, int length) int write(char cbuf[], int offset, int length)
Présentation Flux octet Flux caractère Sérialisation Présentation Description Exemples Présentation Flux octet Flux caractère Sérialisation Présentation Description Exemples
Conteneurs de données
FileInputStream
LineNumberInputStream FileInputStream lecture de fichiers (octet par octet)
PipedInputStream
DataInputStream
FilterInputStream PipedInputStream lecture des données venant d’un
BufferedInputStream
InputStream ByteArrayInputStream
PushbackInputStream
PipedOutputStream
SequenceInputStream
ByteArrayInputStream lecture de données dans un tampon d’octets
ObjectInputStream
(tableau) en mémoire
FileOutputStream
PipedOutputStream DataOutputStream
Traitement de données
OutputStream FilterOutputStream BufferedOutputStream
ByteArrayOutputStream PrintStream SequenceInputStream concaténation de flux en un seul
ObjectOutputStream ObjectInputStream lecture d’objets (désérialisation d’objets java)
FilterInputStream lecture en modifiant certaines données
En gris les classes liés à des conteneurs de données (numérotation, conversions de données,
En blanc les classes liés à des traitements des données bufferisation, vue en avant, . . . )
Présentation Flux octet Flux caractère Sérialisation Présentation Description Exemples Présentation Flux octet Flux caractère Sérialisation Présentation Description Exemples
Conteneurs de données
Conteneurs de données
CharArrayWriter écriture de caractères dans un tampon d’octets
CharArrayReader lecture de caractères dans un tampon d’octets
(tableau) en mémoire
(tableau) en mémoire
FileWriter écriture de caractères dans un fichier texte
FileReader lecture de caractères dans un fichier texte
PipedWriter écriture de caractères dans un flux lu par un
PipedReader lecture de caractères venant d’un PipedWriter
PipedReader
StringReader lecture de caractères à partir d’une String
StringWriter écriture de caracères dans une String
Traitement de données
Traitement de données
BufferedReader bufferisation de la lecture d’un flux caractère
BufferedWriter bufferisation de l’écriture dans un flux caractère
InputStreamReader conversion de flux octet en flux caractère
OutputStreamWriter conversion de flux caractère en flux octet
FilterReader lecture en modifiant certain caractères (vue en
FilterWriter écriture en modifiant certains caractères
avant, . . . )
PrintWriter écriture avec facilité de formatage
Présentation Flux octet Flux caractère Sérialisation Présentation Description Exemples Présentation Flux octet Flux caractère Sérialisation Présentation Écriture/Lecture Contrôle
Principe de la sérialisation
Sérialisation
TestFluxCaractere.java Permet l’envoi d’objets à travers des flux, notamment des flux de fichiers
public static void main(String[] args) throws IOException { permettant ainsi la persistance.
Reader reader = new BufferedReader(new FileReader(args[0]));
Writer writer = new BufferedWriter(new FileWriter(args[1]));
PrintWriter pwriter = new PrintWriter(System.out); En java
int c; La sérialisation d’objets est notamment apparu dans Java en support à la
while ( (c = reader.read()) != -1) {
pwriter.write(c); technique Remote Method Invocation.
writer.write(c);
} tout objet implémentant l’interface Serializable est sérialisable
pwriter.flush();
reader.close(); en une suite d’octets, qui pourra être relue pour reconstruire l’objet.
writer.close();
} Java prend en charge la sérialisation des réseaux d’objets (tableaux
d’objets, objets d’objets, ...)
la sérialisation est indépendante de la plateforme
ni les attributs transient, ni les static ne sont sérialisés
à la désérialisation les constructeurs ne sont pas utilisés
Gestion des entrées / sorties 15 / 29 Gestion des entrées / sorties 16 / 29
ExempleSerialisationObjetsEcriture.java
FileOutputStream fichier = new FileOutputStream(args[0]);
ObjectOutputStream / ObjectInputStream ObjectOutputStream flotObjets = new ObjectOutputStream(fichier);
flotObjets.writeObject("La réponse à la question ultime de la vie, de l’univers
Ces deux flots permettent l’écriture d’objets dans des flots, mais aussi les et de toutes choses est ");
types simples flotObjets.writeInt(42);
flotObjets.flush();
writeObject / readObject
writeInt / readInt ExempleSerialisationObjetsLecture.java
... FileInputStream fichier = new FileInputStream(args[0]);
ObjectInputStream flotObjets = new ObjectInputStream(fichier);
try {
Faire qu’un objet soit sérialisable String question = (String)flotObjets.readObject();
int reponse = flotObjets.readInt();
La classe doit implémenter l’interface Serializable qui ne contient System.out.println(question+reponse);
} catch (ClassNotFoundException e) {
aucune méthode. System.err.println("Impossible de trouver la classe de l’objet
que vous tentez de désérialiser");
e.printStackTrace();
}
Présentation Flux octet Flux caractère Sérialisation Présentation Écriture/Lecture Contrôle Présentation Flux octet Flux caractère Sérialisation Présentation Écriture/Lecture Contrôle
Exemple 2
TestsSerialisation.java (...)
ObjetTest.java
// sérialisation
public class ObjetTest implements Serializable { ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream("/tmp/fichier1"));
private StringBuilder chaine; oos1.writeObject(objTest);
private int nombre; oos1.writeObject(objTest);
public ObjetTest(StringBuilder chaine, int nombre) { oos1.close();
this .chaine = chaine; ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream("/tmp/fichier2"));
this .nombre = nombre; oos2.writeObject(objTest);
} oos2.close();
public String toString() {
return "["+super.toString()+"]("+chaine+"---"+nombre+")"; // désérialisation
} ObjectInputStream ois1 = new ObjectInputStream(new FileInputStream("/tmp/fichier1"));
public StringBuilder getChaine() { objTest1 = (ObjetTest[])ois1.readObject();
return chaine; 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();
TestsSerialisation.java (...)
ObjectInputStream ois2 = new ObjectInputStream(new FileInputStream("/tmp/fichier2"));
StringBuilder chaine = new StringBuilder("La cha^
ıne Lassie"); objTest3 = (ObjetTest[])ois2.readObject();
ObjetTest[] objTest, objTest1, objTest2, objTest3; System.out.println("objTest 3 -> "+objTest3 + Arrays.toString(objTest3));
objTest = new ObjetTest[2]; ois2.close();
objTest[0] = new ObjetTest(chaine,1);
objTest[1] = new ObjetTest(chaine,2);
System.out.println("objTest -> "+objTest + Arrays.toString(objTest));
Exécution
objTest -> ObjetTest;@7d772e[[ObjetTest@11b86e7](La cha^ıne Lassie---1),
[ObjetTest@35ce36](La cha^
ıne Lassie---2)] transient
objTest1 -> ObjetTest;@89ae9e[[ObjetTest@1270b73](La chienne Lassie---1), ce mot clé associé à un attribut spécifie que ce dernier ne doit pas être
[ObjetTest@60aeb0](La chienne Lassie---2)]
sérialisé
objTest2 -> ObjetTest;@89ae9e[[ObjetTest@1270b73](La chienne Lassie---1),
[ObjetTest@60aeb0](La chienne Lassie---2)]
Utilisation
// le stockage d’un reseau d’objets doit ^
etre fait dans un m^
eme flux
// sinon il y a duplications d’objets Peut être utilisé notamment lorsque la sécurité est importante, exemple :
objTest3 -> ObjetTest;@16caf43[[ObjetTest@66848c](La cha^ıne Lassie---1),
[ObjetTest@8813f2](La cha^
ıne Lassie---2)] ne pas sérialiser un mot de passe ⇒ transient
Présentation Flux octet Flux caractère Sérialisation Présentation Écriture/Lecture Contrôle Présentation Flux octet Flux caractère Sérialisation Présentation Écriture/Lecture Contrôle
ObjetTestSerializablePerso.java
public class ObjetTestSerializablePerso implements Serializable {
Objectif private String login;
private transient String password;
Modifier le comportement de base de la sérialisation public ObjetTestSerializablePerso(String login, String password) {
this .login = login;
this .password = password;
Technique }
private void writeObject(ObjectOutputStream out) throws IOException {
Implémenter Serializable et ajouter les méthodes suivantes : out.defaultWriteObject();
private void writeObject(ObjectOutputStream s) throws IOException { out.writeObject(crypte(password));
}
s.defaultWriteObject(); // pour le comportement par défaut
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// code in.defaultReadObject();
} password=crypte((String)in.readObject());
private void readObject(ObjectInputStream s) throws IOException { }
s.defaultReadObject(); // pour le comportement par défaut private String crypte(String chaine) {
// code return new StringBuilder(chaine).reverse().toString();
}
}
public String toString() {
return "login : "+login+" / password : "+password;
}
}
Présentation Flux octet Flux caractère Sérialisation Présentation Écriture/Lecture Contrôle Présentation Flux octet Flux caractère Sérialisation Présentation Écriture/Lecture Contrôle
Exemple
TestSerialisationExternalizable.java
ObjetTestExternalizable.java public class TestSerialisationExternalizable {
public static void main(String[] args) throws Exception {
public class ObjetTestExternalizable implements Externalizable { ObjetTestExternalizable objTestEx1 = new ObjetTestExternalizable(1);
private int nombre; ObjetTestExternalizable objTestEx2 = new ObjetTestExternalizable(2);
private int nombreAleatoire;
public ObjetTestExternalizable() { System.out.println(objTestEx1);
nombreAleatoire = (int)(100*Math.random()); System.out.println(objTestEx2);
System.err.println("On m’appelle ?");
} ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/tmp/fichier"));
public ObjetTestExternalizable(int nombre) { oos.writeObject(objTestEx1);
this (); oos.writeObject(objTestEx1);
this .nombre = nombre; oos.writeObject(objTestEx2);
} oos.close();
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(nombre); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("/tmp/fichier"));
} System.out.println(ois.readObject());
public void readExternal(ObjectInput out) throws IOException,ClassNotFoundException { System.out.println(ois.readObject());
nombre = out.readInt(); System.out.println(ois.readObject());
} ois.close();
public String toString() { }
return "["+super.toString()+"]("+nombreAleatoire+"---"+nombre+")"; }
}
}
Exécution
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)