File Handling
File Handling
File Handling
Chapitre
Entrée
Ex : Nous sommes la destination
Sortie
Ex : Nous sommes la source
Flux d’octets et Flux de caractères (2)
5
Les flux sont décomposés en deux grandes familles
◼ Flux d’octets
◼ classes abstraites InputStream et OutputStream et leurs sous-
classes concrètes respectives
◼ Flux de caractères
◼ classes abstraites Reader et Writer et leurs sous-classes
concrètes respectives
les sous-classes de Reader sont des types de flux en lecture sur des
ensembles de caractères
les sous-classes de Writer sont des types de flux en écriture sur des ensembles
de caractères
les sous-classes de InputStream sont des types de flux en lecture sur des
ensembles d'octets
les sous-classes de OutputStream sont des types de flux en écriture sur des
ensembles d'octets
Flux d’octets et Flux de caractères (4)
7
Pour les filtres, le préfixe contient le type de traitement qu'il effectue. Les filtres
n'existent pas obligatoirement pour des flux en entrée et en sortie.
Flux d’octets et Flux de caractères (6)
9
La package java.io définit ainsi plusieurs classes :
import java.io.*;
class InOut {
public static void main(String args[]) throws IOException {
BufferedReader entreeClavier = new BufferedReader(
new InputStreamReader(System.in));
System.out.println ("Saisissez une phrase :");
String saisie = entreeClavier.readLine();
System.out.println ("Merci !");
System.out.println ("Votre phrase est : ");
System.out.println (saisie);
}
}
Formater la sortie
13
Symbole monétaire : remplacé par le signe monétaire de la langue locale. Permet également au
¤ formatage d'utiliser le séparateur décimal monétaire au lieu du séparateur décimal normal. ¤¤ permet
au formatage d'utiliser des symboles monétaires internationaux.
' Marque un guillemet autour des caractères spéciaux dans le préfixe ou le suffixe du nombre formaté.
Flux d’octets et Flux de caractères (6)
16
Flux Buffered
17
Flux Character
Flux bufferisés
Les flux de caractères
18
◼ boolean mkdir( )
◼ boolean exists( )
◼ boolean delete( )
◼ File getParentFile( )
◼ long lastModified( )
Gestion des fichiers (3)
21
Gestion des fichiers (4)
22
Gestion des fichiers (5)
23
import java.io.*; Les objets et classes relatifs à
public class Listeur la gestion des fichiers se
{ trouvent dans le package
java.io
public static void main(String[] args)
{ A partir du chemin d'un dossier ou
Listeur.litrep(new File(".")); d'un fichier, on peut créer un objet
} File : ici on va lister le répertoire
public static void litrep(File rep) courant (« . »)
{
if (rep.isDirectory()) Les méthodes isFile() et
{ //liste les fichiers du répertoire isDirectory() permettent de
déterminer si mon objet File est
String[] t=rep.list();
une fichier ou un répertoire
for (int i=0;i<t.length;i++)
System.out.println(t[i]);
}
}
}
Gestion des fichiers (6)
24
import java.io.*;
public class Listeur
{
Le nom complet du fichier
public static void main(String[] args) est rep\fichier
{ litrep(new File( "c:\\"));}
Exemples
FileInputStream et FileOutputStream (1)
26
C'est par le biais des objets FileInputStream et FileOutputStream que nous allons
pouvoir :
◼ lire un fichier d’octets;
◼ écrire des octets dans un fichier.
Ces classes héritent des classes abstraites InputStream et OutputStream, présentes
dans le package java.io.
FileInputStream et FileOutputStream (2)
27
FileInputStream et FileOutputStream (3)
28
FileInputStream et FileOutputStream (4)
29
BufferedInputStream et BuffreredOutputStream (1)
30
PrintWriter(Writer)
Créer un objet PrintWriter pour
imprimer des données formatées dans
un autre Writer.
PrintWriter(File file)
Créer un objet PrintWriter pour
imprimer des données formatées dans
un fichier.
Si BufferedWriter participe à la
structure de PrintWriter, les données
seront écrites temporairement dans
buffer (de BufferedWriter)
File(Writer/Reader) et Print(Writer/Reader) (2)
36
BufferedWriter – BufferedReader (1)
37
import java.io.*;
public class Ecrire
{
public static void main(String[] args)
A partir du chemin d'un dossier ou
{ d'un fichier, on peut créer un objet
try FileWriter puis à partir ce celui-ci,
{ on crée un BufferedWriter
FileWriter fw=new
FileWriter("c:\\temp\\essai.txt");
BufferedWriter bw= new BufferedWriter(fw);
bw.write("Ceci est mon fichier");
bw.newLine();
bw.write("Il est à moi...");
bw.close();
} Attention, lorsque l'on a
écrit, il ne faut pas oublier
catch (Exception e)
de fermer le fichier
{ System.out.println("Erreur "+e);}
}}
BufferedWriter – BufferedReader (3)
39
import java.io.*;
public class LireLigne A partir du chemin d'un dossier ou
{ d'un fichier, on peut créer un objet
public static void main(String[] args) FileReader puis à partir ce celui-ci,
{ on crée un BufferedReader
try
{
FileReader fr=new FileReader("c:\\windows\\system.ini");
BufferedReader br= new BufferedReader(fr);
while (br.ready())
System.out.println(br.readLine());
br.close();
}
catch (Exception e) Dans l'objet BufferedReader
{System.out.println("Erreur "+e);} on dispose d'une méthode
} readLine()
}
TRES IMPORTANT
40
Le code ne compile plus ! L’objet Notice n'est pas sérialisable, une erreur
d’exécution est donc levée. Maintenant, deux choix s'offrent à vous :
◼ soit vous faites en sorte de rendre votre objet sérialisable ;
◼ soit vous spécifiez dans votre classe Game que la variable notice n'a pas
à être sérialisée.
Pour la première option, c'est simple, il suffit d'implémenter l'interface
sérialisable dans notre classe Notice. Pour la seconde, il suffit de déclarer
votre variable : transient ;
ObjectInputStream et ObjectOutputStream (6)
47
Sérialisation (1)
48
La sérialisation d'un objet permet d'envoyer dans un flux les informations sur la
classe et l'état d'un objet pour permettre de le récréer ultérieurement. Elle
permet donc de transformer l'état d'un objet pour permettre sa persistance (en
dehors de la JVM) ou de l'échanger en utilisant le réseau.
L'opération inverse qui consiste à créer une nouvelle instance à partir du résultat
d'une sérialisation s'appelle la désérialisation.
Sérialisation (2)
49
Tous les champs d'un objet sont sérialisés, y compris ceux de la section
privée.
◼ Solution
Serializable est une interface de marqueur, c'est-à-dire qu'elle L'interface Externalizable n'est pas une interface de marqueur et
ne contient aucune méthode. définit donc deux méthodes writeExternal() et readExternal()
L'interface sérialisable transmet la responsabilité de la L'interface externalizable fournit toutes les responsabilités de
sérialisation à JVM et le programmeur n'a aucun contrôle sur sérialisation à un programmeur et, par conséquent, JVM n'a aucun
la sérialisation, et c'est un algorithme par défaut. contrôle sur la sérialisation.
La sérialisation à l'aide d'une interface sérializable a de La sérialisation à l'aide d'une interface externalizable offre de
mauvaises performances. meilleures performances.
La sérialisation par défaut ne nécessite aucun constructeur Un constructeur public sans argument est requis lors de
sans argument. l'utilisation d'une interface externalizable.
Il est difficile d'analyser et de modifier la structure des classes Il est relativement facile d'analyser et de modifier la structure des
car tout changement de structure peut interrompre la classes en raison du contrôle complet de la logique de
sérialisation. sérialisation.
Le mot clé Transient joue ici un rôle important. Le mot clé Transient joue un autre role.
Exemple de Externalizable
54
import java.io.*;
public class Blip3 implements Externalizable {
private int i; private String s;
public Blip3() {
print("Blip3 Constructor"); // is not initialized
}
public Blip3(String x, int a) {
print("Blip3(String x, int a)");
i = a; s = x; // is initialized only in non-default constructor.
}
public void writeExternal(ObjectOutput out) throws IOException {
print("Blip3.writeExternal");
out.writeObject(s); // You must do this
out.writeInt(i); // You must do this
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
print("Blip3.readExternal");
s = (String)in.readObject(); // You must do this
i = in.readInt(); // You must do this
}
}
Exemple de sérialisation
55
EXERCICE:
1. On souhaite pouvoir sérialiser les objets de cette classe
2. On souhaite limiter la sérialisation uniquement au champs info et aux
valeurs dans la diagonale de la matrice
Exemple de séerialisation
56
class NbOcc
{
public static void main (String[] argv) throws IOException
{
int nombre=0;
String ligne;
StringTokenizer st;
String mot=new String(argv[1]);
BufferedReader entree =new BufferedReader
(new FileReader(argv[0]));
while((ligne=entree.readLine())!=null)
{
st=new StringTokenizer(ligne,".;() =[]");
while(st.hasMoreTokens())
if (mot.equals(st.nextToken())) nombre++;
}
System.out.println("Le mot "+mot+" figure "+nombre+" fois");
}
}