Plan
Entrées / Sorties et flux
Les différents types de Flux
La classe File
Lire et Ecrire ses objets (Sérialisation)
2
Entrée et Sortie standard
3
Exemple : lire une ligne sur l’entré
standard
4
Exemple : lire un entier tapé au clavier
BufferedReader fc = new BufferedReader
(new InputStreamReader([Link]));
String chaineLue = [Link](); Mode console
int i = [Link](chaineLue);
Depuis la version 5, on a aussi la classe Scanner :
Scanner sc = new Scanner([Link]);
int i = [Link]();
String chaineLue =
[Link](null,"Votre age ");
int i = [Link](chaineLue);
Mode Interface
[Link].*;
Objectifs des E/S (I/O)
Communiquer avec le monde extérieur :
o Qui/Quoi ?
Fichier sur le disque dur local, clavier, réseau, etc.
o Comment ?
En binaire -en octet (byte), en caractère,
Ligne par ligne, par mot, par caractère,
Séquentiellement, random-acces, Buffer.
6
Objectifs des E/S (I/O)
Le concept de base est celui de flux : stream
7
Le package [Link]
Le package [Link] regroupe les classes
pour les E/S
Il se divise en 2 catégories
o E/S par Octet (byte) - 8-bit – Flot binaire
o E/S par Char - 16 bit Unicode- Flot de texte
8
E/S par Octet (byte) - 8-bit
Les entrées (méthode read() ) :
o InputStream avec la méthode
public int read(byte[] b) throws IOException
Les sorties (méthode write()) :
o OutputStream avec la méthode
public void write(byte[] b) throws IOException
N’oublions pas la méthode close().
9
E/S par Octet (byte) - 8-bit
DataInputStream DataOutputStream
Toujours avec un Input/Output Stream
E/S par Char - 16 bit Unicode
Les entrées (méthode read() ) :
o Reader avec la méthode
public int read(char[] b) throws IOException
Les sorties (méthode write()) :
o Writer avec la méthode
public void write(char[] b) throws IOException
avec la méthode append() en plus
N’oublions pas la méthode close().
11
E/S par Char - 16 bit Unicode
Toujours avec un Reader/Writer
12
E/S par Char - 16 bit Unicode
Toujours avec un Reader/Writer
13
Schéma de programmation
Choisir son gestionnaire de flux :
o Basé sur des caractères : XxxReader/Writer
o Basé sur des octets : XxxInputStream/OutputStream
Ex : lire un fichier
c’est du texte : FileReader
c’est des octets : FileInputStream
Remarque : [Link] et [Link] = PrintStream
[Link] = InputStream
14
Schéma de programmation
Choisir son gestionnaire de flux :
o Basé sur des caractères : XxxReader/Writer
o Basé sur des octets : XxxInputStream/OutputStream
15
Les types de Stream
Un objet dérivant d’InputStream (OutputStream)
peut lire (écrire) à partir de différentes sources :
Ces classes se généralisent pour l’écriture et pour les
Reader/Writer 16
Ex : copier un fichier textuel
import [Link].*;
public class Exemple1 {
public static void main(String[] args) throws IOException {
// ouverture d'un flux d'entrée en char
FileReader fr = new FileReader("c:\\back1\\[Link]");
// ouverture d'un flux de sortie en char
FileWriter fw = new FileWriter("c:\\back1\\[Link]");
int c;
// lit caractère par caractère jusqu’à la fin, c en int
while ((c = [Link]()) != -1) [Link](c);
[Link]();
[Link]();
}
}
17
I/O de types primitifs
Pour faire mieux que des caractères ou des octet,
utilisons : DataInputStream et DataOutputStream
Ce sont des adaptateurs, ils se branchent sur les
InputStream et OutputStream
La liste des méthodes : readBoolean, readFloat,
readDouble, et available() pour voir les octets restantes
Le symétrique existe aussi pour l’écriture
18
Exemple de flux d’entrée
public class Exemple2 {
public static void main(String[] args) throws IOException {
int[] entiers = { 12, 8, 13, 29, 50 };
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream
new FileOutputStream("c:\\back1\\[Link]")));
for (int i = 0; i < [Link]; i++) [Link](entiers[i]);
[Link](); //fermeture
DataInputStream dis = new DataInputStream(new BufferedInputStream(
new FileInputStream("c:\\back1\\[Link]")));
for (int i = 0; i < [Link]; i++) [Link]([Link]());
[Link](); //fermeture } } 19
Flux Buffered
L’usage de flux Byte ou Character peuvent être
coûteux : ex : accès au disque dur, connexion réseau, ...
Les flux bufferisés lisent les données par blocs :
Chargée en une fois dans la mémoire
Les buffers se branchent comme des convertisseurs sur
les flux standards :
BufferedReader br= new BufferedReader( new
FileReader("[Link]"));
BufferedWriter os = new BufferedWriter( new
20
FileWriter("[Link]"));
Entrées/Sorties et Exceptions
21
La classe File
22
Exemple de File
public class Exemple2 {
public static void main(String[] args) {
File dir = new File("C:\\windows\\
system32");
if([Link]()) {
String[] files = [Link]();
for(int i = 0; i<[Link]; i++){
if(files[i].endsWith("exe"))
[Link](files[i]);
}
}
} 23
Exemple de File
24
Sérialisation
La sérialisation consiste à écrire des données
présentes en mémoire vers un flux de données
binaires, ce procédé va permet de rendre nos objets
persistants. Ainsi il pourra être stocké sur un disque
dur ou transmis au travers d'un réseau pour le créer
dans une autre JVM (RMI, Beans, etc.).
25
Sérialisation
Pour pouvoir lire ou écrire un objet, la classe de cet objet doit
oimplémenter l’interface Serializable ou Externalizable.
L’interface Serializable sert à marquer le type de l’objet
comme candidat à la serialisation. Elle ne contient rien !
o L’interface Externalizable hérite de Serializable et permet
d’expliciter la manière de lire et d’écrire les objets (ex
compression, meta-données).
oSi un attribut est précédé du mot-clé transient, il n’est pas inclus
dans le processus de sérialisation 26
Les bases de la Sérialisation
27
Les bases de la Sérialisation
Pour sérialiser un objet,
1- instancier un type de OutputStream,
2. l’associer à un objet de type ObjectOutputStream.
3. Appeller la méthode writeObject( ),
et l’objet est sérialisé puis envoyé à l’OutputStream.
28
Les bases de la Sérialisation
L’opération est bien sûr reversible :
1. Instancier un InputStream
2. L’associer à un ObjectInputStream
3. Appeller la méthode readObject( ).
4. Récupérer l’Object en le faisant le castant (transtypage)
29
Exemple de Sérialisation
public class Personne implements Serializable {
private String nom;
private int age;
public Personne2(String nom, int age) {
[Link] = nom; [Link] = age; }
}
//getters et les setters
@Override
public String toString() {
return "Personne [nom=" + nom + ", age=" + age + "]";
}
}
30
Exemple de Sérialisation
public class TestSerializable {
public static void sauvegarder(Personne p) throws IOException
ObjectOutputStream oos = new ObjectOutputStream(new
FileOutputStream("c:\\back1\\[Link]"));
[Link](p);
[Link]();
}
public static Personne retourner() throws Exception {
Personne p;
ObjectInputStream ois = new ObjectInputStream(new
FileInputStream("c:\\back1\\[Link]"));
p = (Personne) [Link]();
[Link]();
return p;
}
31
}
Exemple de Sérialisation
public static void main(String[] args) {
Personne p = new Personne("p1",120);
try {
[Link](p);
Personne p = [Link]();
[Link](p2);
} catch (IOException e) {
[Link]();
}
}
}//fin du TestSerializable
32
Exemple de Sérialisation
33
Exemple de Sérialisation
34
Fin
35