Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Flux et entrées/sorties
Julien Provillard
http://www.i3s.unice.fr/~provilla/poo/
julien.provillard@unice.fr
Programmation orientée objet
Objectifs
Entrées sorties
Flux de caractères : Reader/Writer
Flux standards
Flux d’octets
2
Programmation orientée objet
Paquetage java.io
Système
Flux d'entrée Flux de sortie
d'exploitation
PrintWriter
DataInputStream DataOutputStream
3
Programmation orientée objet
4
Programmation orientée objet
5
Programmation orientée objet
6
Programmation orientée objet
7
Programmation orientée objet
8
Programmation orientée objet
Type de fichier
boolean isAbsolute()
• Chemin absolu
boolean isDirectory()
• Est un dossier ?
boolean isFile()
• Est un fichier ?
boolean isHidden()
• Est un fichier caché ?
9
Programmation orientée objet
10
Programmation orientée objet
11
Programmation orientée objet
12
LES FLUX DE CARACTÈRES
13
Programmation orientée objet
14
Programmation orientée objet
CharArrayReader
InputStreamReader FileReader
« abstract »
Reader
FilterReader PushbackReader
PipedReader
StringReader
15
Programmation orientée objet
Exemple
FileReader r = new FileReader("fic.txt");
16
Programmation orientée objet
17
Programmation orientée objet
18
Programmation orientée objet
19
Programmation orientée objet
CharArrayWriter
OutputStreamWriter FileWriter
« abstract »
FilterWriter
Writer
PipedWriter
StringWriter
PrintWriter
20
Programmation orientée objet
Exemple
FileWriter w = new FileWriter("fic.txt");
21
Programmation orientée objet
22
Programmation orientée objet
FileWriter et PrintWriter
On peut diriger un flux de sortie vers un fichier (on choisit le nom du fichier)
FileWriter fw = new FileWriter("fic.txt");
FileWriter permet d’écrire un caractère à la fois
void write(int unicode);
Pour écrire une chaîne de caractère, il faut écrire tous les caractère un par un
Pour écrire un int, il faut aussi le décomposer en caractères !
Pas très pratique : on préfère généralement utiliser un PrintWriter :
PrintWriter pw = new PrintWriter(fw);
pw.print("message");
23
Programmation orientée objet
Constructeurs
PrintWriter(Writer)
PrintWriter(File)
PrintWriter(String)
PrintWriter(OutputStream)
24
Programmation orientée objet
25
Programmation orientée objet
26
Programmation orientée objet
27
Programmation orientée objet
28
Programmation orientée objet
29
Programmation orientée objet
30
Programmation orientée objet
31
Programmation orientée objet
32
Programmation orientée objet
33
LES FLUX D’OCTETS
34
Programmation orientée objet
Octets ou caractères ?
En pratique il est rare qu'on sauvegarde les données au format texte
Ça prend trop de place !
L'entier le plus petit est : -2147483648
Il faut 11 caractères pour coder ce nombre !
Les fichiers courants sont mémorisés en binaire
Suite d'octets
Difficile à lire par l'homme
Prend moins de place, un entier 32 bits prend 4 octets !
Exemples : .doc, .bmp, .exe, …
35
Programmation orientée objet
36
Programmation orientée objet
37
Programmation orientée objet
38
Programmation orientée objet
39
Programmation orientée objet
40
GESTION DES RESSOURCES
41
Programmation orientée objet
42
Programmation orientée objet
ARM: avant
public class Lecture {
static public void main(String[] args) {
try {
FileReader fr = new FileReader("fic.txt");
BufferedReader br = new BufferedReader(fr);
String ligne = br.readLine();
while(ligne != null) {
System.out.println(ligne);
ligne = br.readLine();
}
br.close();
} catch(IOException ex) {
System.err.println("Erreur de lecture : " + ex);
}
}
}
Si une exception se produit la ressource br n’est pas fermée
43
Programmation orientée objet
ARM: avant
public class Lecture {
static public void main(String[] args) {
try {
FileReader fr = new FileReader("fic.txt");
BufferedReader br = new BufferedReader(fr);
String ligne = br.readLine();
while(ligne != null) {
System.out.println(ligne);
ligne = br.readLine();
}
} catch(IOException ex) {
System.err.println("Erreur de lecture : " + ex);
} finally { br.close(); }
}
}
Est illégal car br n’est visible que dans le bloc try !
44
Programmation orientée objet
ARM: avant
public class Lecture {
static public void main(String[] args) {
FileReader fr = new FileReader("fic.txt");
BufferedReader br = new BufferedReader(fr);
try {
String ligne = br.readLine();
while(ligne != null) {
System.out.println(ligne);
ligne = br.readLine();
}
} catch(IOException ex) {
System.err.println("Erreur de lecture : " + ex);
} finally { br.close(); }
}
}
Est illégal car new FileReader peut lever une exception !
2 blocs try imbriqués!
45
Programmation orientée objet
ARM: avant
public class Lecture {
static public void main(String[] args) {
try {
FileReader fr = new FileReader("fic.txt");
BufferedReader br = new BufferedReader(fr);
try {
String ligne = br.readLine();
while(ligne != null) {
System.out.println(ligne);
ligne = br.readLine();
}
} catch(IOException ex) {
System.err.println("Erreur de lecture : " + ex);
} finally { br.close(); }
} catch(IOException ex) {
System.err.println("Fichier non trouvé : " + ex);
}
}
}
46
Programmation orientée objet
ARM: avant
public class Copie {
static public void main(String[] args) {
try {
FileReader fr = new FileReader("in.txt");
BufferedReader br = new BufferedReader(fr);
try {
PrintWriter pw = new PrintWriter("out.txt");
try {
String ligne = br.readLine();
while(ligne != null) { Un bloc try/catch par ressource!
pw.println(ligne);
ligne = br.readLine();
}
} catch (IOException ex) { System.err.println(...); } finally { pw.close(); }
} catch (IOException ex) { System.err.println(...); } finally { br.close(); }
} catch (IOException ex) { System.err.println(...); }
}
} 47
Programmation orientée objet
ARM: après
public class Copie {
static public void main(String[] args) {
try (FileReader fr = new FileReader("in.txt");
BufferedReader br = new BufferedReader(fr);
PrintWriter pw = new PrintWriter("out.txt");) {
String ligne = br.readLine();
while (ligne != null) {
pw.println(ligne); Appel close automatiquement
ligne = br.readLine(); pour fermer les ressources
}
} catch (FileNotFoundException ex) {
System.err.println("Fichier non trouvé : " + ex);
} catch (IOException ex) {
System.err.println("Erreur de lecture : " + ex);
}
}
} Exécuté après l’appel à close
48
Programmation orientée objet
ARM: après
Les ressources déclarées font parties de la clause try
Les exceptions levées sont après le catch qui suit
try (FileReader fr = new FileReader("fic.txt");
BufferedReader br = new BufferedReader(fr)) {
...
} catch (IOException ex) { ... }
49
Programmation orientée objet
Closeable vs AutoCloseable
java.lang.AutoCloseable
public interface AutoCloseable {
// pas nécessairement idempotent mais recommandé
void close() throws Exception;
}
java.io.Closeable
public interface Closeable extends AutoCloseable {
// close doit être idempotent
void close() throws IOException;
}
50