Vous êtes sur la page 1sur 27

SUITE DU COURS DE

JAVA
A. YAHYAOUY

A.U: 2007-2008

Les fichiers

Introduction
En java, les fichiers sont reprsents par des objets particuliers
appels en anglais (Stream). Ce mot signifie flot en franais.
En java, les streams sont reprsentes dans des classes
dfinies dans le package java.io
Il existe de nombreuses sortes de stream, qui peuvent tre
classs selon plusieurs critres:
Les streams dentres (la lecture) et les streams de sortie
(lcriture).
Les streams de caractres (texte) et les streams de donnes
linaires.
Les streams de traitement des donnes et les streams de
communication de donnes.
Les streams accs squentiel et les streams accs direct.
Les streams avec et sans tampon de donnes.

Les streams de donnes binaires


Les streams de donnes binaires peuvent contenir dautre type
de donnes que des caractres (des int par exemple).
En java, les streams de donnes binaires drivent des deux
classes (du package java.io): InputStream pour les entres et
OutputStream pour les sorties.

Ecriture dans un fichier binaires


Lcriture dans un fichier se fait grce aux streams dcriture
pour les donnes binaires.
En java, les streams dcriture pour les donnes binaires sont
des sous classes de la classe java.io.OutputStream
DataOutputStream: criture squentielle dans un fichier binaire.
BufferedOuputStream: criture des donnes laide dun
tampon.
PrintStream: criture de donnes avec conversion en octets.

La classe DataOutputStream admet le constructeur:


DataOutputStream (FileOutputStream out): crer un stream dcriture
sur out.
CreerFichierBinaire
{
public static void main(String [] arg) throws IOException
{
DataOutputStream stream= new DataOutputStream(new
FileOutputStream("fichier.dat"));
stream.writeUTF("Bonjour monde java");
stream.writeInt(100);
stream.writeChar(X);
stream.writeBoolean(false);
System.out.println(stream.size());
stream.close();
}
}

Lecture dans un fichier de donnes binaires


La lecture dans un fichier binaires se fait par des streams dentre
pour les donnes binaires.
Les streams dentre pour les donnes binaires sont des sous
classes de la classe InputStream du package java.io
- DataInputStream: lecture squentielle dans un fichier binaire.
- BufferedInputStream: lecture de donnes laide dun tampon

Exemple de lecture dun fichier binaire


class LectureFichierBinaire
{
public static void main(String [] arg) throws IOException
{
DataInputStream stream;
stream= new DataInputStream(new FileInputStream ("fichier.dat"));
System.out.println("La taille du fichier: "+stream.available()+" octets");
System.out.println(stream.readUTF());
System.out.println(stream.readInt());
System.out.println(stream.readChar());
System.out.println(stream.readBoolean());
stream.close();
}
}

Les streams de caractres


Les streams de caractres sont conus pour la lecture et
lcriture de texte. Les streams de caractres drivent des deux
classes abstraites: Reader pour les entres et Writer pour les
sorties.

Ecriture dans un fichier texte


Pour crire dans un fichier texte, il faut utiliser les streams
dcriture qui sont des sous-classes de la classe Writer, qui
contient les mthodes abstraites suivantes:
. write(char[] t, int id, int n), qui permet dcrire n caractres
partir du tableau t, en commenant lindice id.
. close(), qui ferme le stream.
Toutes les classes drives de Writer redfinissent donc
obligatoirement ces mthodes.

Ecriture dans un fichier texte


FileWriter: sous classe particulire de OutputStreamlWriter
utilisant la taille du tampon par dfaut. Cette classe convient
dans la plupart des cas dcriture dun fichier de caractres.
OutputStreamWriter: permet la conversion dun stream de
donnes binaires en stream de caractres.
BufferedWriter: criture de carctres laide dun tampon.
PrintWriter: cette classe permet dcrire des caractres. Elle est
particulirement utilise pour laffichage en mode texte.
La mthode println() de la classe PrintWriter permet dcrire
sur le fichier texte. Cette mthode est surcharge et peut
avoir un argument de type String, char, int,

Exemple dcrire dans un fichier texte


class CreerFichierTexte
{
public static void main(String [] arg) throws IOException
{
PrintWriter ecrire;
ecrire= new PrintWriter (new FileOutputStream("fichier.txt"));
ecrire.println("Bonjour");
ecrire.println(100);
ecrire.println(true);
ecrire.println(10.55);
ecrire.close();
}
}

Lecture dun fichier texte


Pour lire dans un fichier texte, on doit utiliser des sous classes
de la classe Reader. Deux mthodes de cette classe sont
abstraites:
Read(char []t, int id, int n), qui permet de lire n caractres et de
les placer dans le tableau t, partir de lindice id.
Close(), qui ferme le stream.
Toutes les classes drives de Reader redfinissent donc
obligatoirement ces deux mthodes.

Lecture dun fichier texte


FileReader: sous classe particulire de InputStreamlReader
utilisant une taille de tampon par dfaut. Cette classe convient
dans la plupart des cas de lecture dun fichier de caractres.
BufferedReader: lecture de caractres laide dun tampon. Les
caractres peuvent ainsi tre lus en bloc.

Exemple 1:
class LectureFichierTexte
{
public static void main(String [] arg) throws IOException
{
BufferedReader stream=null;
String str;
try{
stream=new BufferedReader(new FileReader("fichier.txt"));
}
catch(FileNotFoundException exc){
System.out.println("Erreur d'ouverture du fichier!!");
}
while((str=stream.readLine())!=null)
System.out.println(str);
stream.close();
}
}

Exemple 2
class DemoFileWriter
{
public static void main(String [] arg) throws IOException
{
FileWriter ecrire;
char tmp[]={'u','n','e',' ','c','h','a','i','n','e', ','d','e', ','c','a','r','a','c','t
,'','r','e','s' };
ecrire= new FileWriter ("fichier.txt");
ecrire.write(tmp);
ecrire.write(tmp,5,20);
ecrire.close();
}
}

Exemple 3
class DemoFileReader
{
public static void main(String [] arg) throws IOException
{
FileReader lire;
char tmp[]=new char[1024];
int nbcar;
lire= new FileReader ("fichier.txt");
nbcar=lire.read(tmp);
for(int i=0;i<nbcar;i++)
System.out.print(tmp[i]);
lire.close();
}
}

La classe File
La classe File donne beaucoup dinformations sur les fichiers (la
taille, date de modification, fichier ou rpertoire, )
Constructeurs:
File(String ch): ch est le chemin daccs
File(String ch, String nom): ch est le chemin complet daccs,
nom est le nom du fichier.

La classe File
Quelques mthodes:
canRead(): renvoie true si le fichier est accessible en lecture
canWrite(): renvoie true si le fichier est accessible en criture
isDirectory(): retourne true si le chemin indiqu existe
isFile(): renvoie true si le fichier indiqu existe
list(): retourne le contenu dun rpertoire.
length(): la taille dun fichier
lastModified(): renvoie la date et lheure de la dernire modification
renameTo(File): renomme un fichier ou un rpertoire
getParent(): retourne le nom du rpertoire parent.
delete(): permet de supprimer un fichier ou un rpertoire

Exemple
public class DemoFile
{ public static void main(String [] args)
{
String nomFichier;
File repertoire=new File(".");
if(repertoire.isDirectory())
{
String [] tab=repertoire.list();
for(int i=0;i<tab.length;i++)
{
nomFichier=tab[i];
File fich=new File(nomFichier);
System.out.println(nomFichier);
}
}
}
}

La classe StreamTokenizer
La classe StreamTokenizer permet de dcouper un flux en
entre en units syntaxiques telles que des mots et des
nombres.
Attributs de cette classe:
double nval: valeur dune unit numrique
String sval: chane contenant les caractres dun mot
int ttype: contient le type de lunit syntaxique lue.
int TT_EOF: constante indiquant que la fin du flux est atteinte
int TT_EOL: constante indiquant qe la fin dune ligne est atteinte
int TT_NUMBER: constante indiquant quun nombre a t lu
int TT_WORD: constante indiquant quun mot a t lu

StreamTokenizer
Quelques mthodes:
StreamTokenizer(Reader)
StreamTokenizer(InputStream)
int lineno(): renvoie le numro de la ligne en cours
nextToken(): recherche lunit suivante
ordinaryChars(int): le caractre pass en paramtre devient un
caractre ordinaire

Exemple
class DemoStreamTokenizer
{
public static void main(String [] arg) throws IOException
{ FileReader fiche=new FileReader ("fichier.txt");;
StreamTokenizer lireST=new StreamTokenizer(fiche);
while(lireST.nextToken()!=StreamTokenizer.TT_EOF)
if(lireST.ttype==StreamTokenizer.TT_WORD)
System.out.print(lireST.sval);
fiche.close();
}
}

La classe RandomAccessFile
La classe RandomAccessFile permet daccder un fichier en
mode criture et lecture la fois, comme elle permet de se
dplacer dans un fichier avec la mthode seek.
La classe RandomAccessFile admet deux constructeurs:
RandomAccessFile(File fichier, String mode)
RandomAccessFile(String nom, String mode)

La classe RandomAccessFile
Quelques mthodes de la classe RandomAccessFile:
int readInt(), float readFloat(), char readChar(),
int read(byte [] t, int id, int n): lit jusqu n octets vers le tableau t.
long getFilePointer(): renvoie la position du pointeur.
seek(long pos): positionne le pointeur la position indique.
void close(): ferme le flux de fichier.
void writeInt(int), writeDouble(double),
void write(byte[] t, int id, int n): crit n octets depuis le tableau t
vers le fichier en commenant de la position id.

Exemple
public class FichierRandomAccess
{ public static void main(String [] args) throws IOException
{
File rep=new File(".","fiche.txt");
RandomAccessFile fiche=new RandomAccessFile(rep,"rw");
int nb;
for(int i=0;i<10;i++) fiche.writeInt(i*i);
fiche.seek(8);
fiche.writeInt(100);
fiche.seek(0);
for(int i=0;i<10;i++)
{
nb=fiche.readInt();
System.out.println(nb);
}
}
}

Exemple de lecture partir du clavier


class DemoLireClavier
{
public static void main(String [] arg) throws IOException
{
BufferedReader lire=new BufferedReader(new
InputStreamReader(System.in));
String ligne;
System.out.println("Entrer une chane de caractre");
ligne=lire.readLine();
System.out.println("Votre chane est:");
System.out.println(ligne);
lire.close();
}
}

Vous aimerez peut-être aussi