Você está na página 1de 40

LA

GESTION DES

ENTRES SORTIES

EN JAVA

Responsable du cours: Raoudha Ben


Jemaa
Auditoire: 1DNI
AU: 2015-2016

INTRODUCTION

Si on souhaite sauvegarder certains


rsultats de l'excution du programme, il
faut les enregistrer dans des fichiers sur un
priphrique l'aide des flux (streams)
Java.

un flux se situe entre un programme et un


fichier sur disque.
2

lire

des donnes sur le disque,


il te faut un flux d'entre (input
stream) ;

crire

des donnes sur le


disque, ouvre un flux de sortie
(output stream).

Un

programme lit ou crit les


donnes dans un flux en srie octet aprs octet, caractre
aprs caractre, etc.

INTRODUCTION
Comme

le programme utilise
diffrents types de donnes tels
que String, int, double et autres,
on doit utiliser un flux Java
appropri, par exemple un flux
d'octets (byte stream), un flux de
caractres (character stream) ou
un flux de donnes (data
stream).

Les classes qui fonctionnent avec des flux


de fichiers sont situes dans les paquetages
java.io. et java.nio.

Quel que soit le type de flux on doit


respecter les trois tapes suivantes:
Ouvrir un flux qui pointe sur un fichier.
Lire ou crire des donnes dans ce flux.
Fermer le flux.
5

FLUX D'OCTETS
Un

programme qui se contente de


copier des fichiers d'un endroit un
autre chargent le fichier original en
mmoire sous la forme d'un ensemble
d'octets, puis les crivent dans le
fichier de destination, octet aprs
octet, l'aide des classes Java
FileInputStream (classe lecture)et
FileOutputStream(classe criture).
6

L'exemple 1 montre comment utiliser la


classe FileInputStream pour lire un fichier
graphique nomm abc.gif, situ dans le
rpertoire c:\exercices.

Ce petit programme n'affiche pas l'image,


mais des nombres qui correspondent la
faon
dont l'image est stocke sur
un
disque.

Chaque octet a une valeur entire positive


comprise entre 0 et 255, que la classe
LecteurOctets affiche en la dlimitant par
des espaces.
7

import java.io.FileInputStream;
import java.io.IOException;
public class LecteurOctets {
public static void main(String[] args) {
FileInputStream monFichier = null;
try { // Ouvre un flux pointant sur le fichier
monFichier = new FileInputStream("c:\\exercices\\abc.gif");
while (true)
{ int valeurEntireOctet = monFichier.read();
System.out.print(" " + valeurEntireOctet);
if (valeurEntireOctet == -1)
{ // Nous avons atteint la fin du fichier Sortons de la boucle
break; } }
} catch (IOException exception)
{ System.out.println("Impossible de lire le fichier : " + exception.toString()); }
finally { try { monFichier.close(); }
8
catch (Exception exception1){ exception1.printStackTrace() ; }
System.out.println("Lecture du fichier termine."); } } }

Lexemple 2: Le code suivant crit plusieurs


octets, reprsents par des nombres entiers, dans
le fichier xyz.dat, l'aide de la classe
FileOutputStream

int donnes[] = {56, 230, 123, 43, 11, 37};


FileOutputStream monFichier = null;
try { // Ouvre le fichier xyz.dat et y
//
enregistre les donnes du tableau
monFichier = new FileOutputStream("xyz.dat");
for (int i = 0; i < donnes.length; i++)
{ monFichier.write(donnes[i]); }
}
catch (IOException exception)
{ System.out.println("Impossible d'crire dans le
fichier :" + exception.toString()); }
finally{
try{ monFichier.close();
} catch (Exception exception1)
{ exception1.printStackTrace(); }
}

10

FLUX

TAMPON

nous avons lu et crit les donnes un octet la


fois, ce qui implique que le programme devra
accder 1000 fois au disque pour lire un fichier
de 1000 octets.

Mais l'accs aux donnes sur le disque est bien


plus lent que la manipulation de donnes en
mmoire. Pour minimiser le nombre de
tentatives d'accs au disque, Java fournit ce
qu'on appelle des tampons (buffers), qui sont
des sortes de "rservoirs de donnes".
11

FLUX

TAMPON

La classe BufferedInputStream permet de


remplir rapidement la mmoire tampon avec des
donnes de FileInputStream. Un flux
tampon charge d'un seul coup dans un
tampon en mmoire un gros paquet d'octets
depuis un fichier. Ensuite, la mthode read()
lit chaque octet dans le tampon beaucoup plus
rapidement qu'elle ne le ferait sur le disque.

Les donnes sont d'abord dverses du


FileInputStream
dans
le
BufferedInputStream, puis passes la
mthode read()

12

FileInputStream monFichier = null;


BufferedInputStream tampon = null;
try {
monFichier = new
FileInputStream("c:\\exercices\\abc.gif");
// Connecte les flux
tampon = new BufferedInputStream(monFichier);
while (true) {
int valeurOctet = tampon.read();
System.out.print(valeurOctet + " ");
if (valeurOctet == -1) break; } }
catch (IOException exception)
{ exception.printStackTrace(); }
finally {
try { tampon.close(); monFichier.close(); }
catch(IOException exception1)
{ exception1.printStackTrace(); }
}

13

FLUX

TAMPON

Quelle est la taille de ce tampon ?


Cela dpend du Java, mais on peut rgler sa
taille et voir si cela rend la lecture de fichier un
peu plus rapide. Par exemple, pour affecter au
tampon une taille de 5000 octets, utilise le
constructeur deux arguments :
BufferedInputStream tampon = new
BufferedInputStream(monFichier, 5000);

BufferedOutputStream fonctionne de la mme


faon, mais avec la classe FileOutputStream.

14

int donnes[] = {56, 230, 123, 43, 11, 37};


FileOutputStream monFichier = null;
BufferedOutputStream tampon = null;
try { monFichier = new
FileOutputStream("xyz.dat");
// Connecte les flux
tampon = new
BufferedOutputStream(monFichier);
for (int i = 0; i < donnes.length; i++)
{ tampon.write(donnes[i]); }
} catch (IOException exception)
{ exception.printStackTrace(); }
finally { try { tampon.flush(); tampon.close();
monFichier.close();
} catch (IOException exception1) {
exception1.printStackTrace(); } }

15

FLUX

TAMPON

Pour s'assurer que tous les octets du tampon sont


envoys au fichier, appelle la mthode flush ()
(vider) lorsque l'criture dans le
BufferedOutputStream est termine.
Mthode

flush()
newLine()

Rle
vide le tampon en crivant les
donnes dans le flux.
crire un sparateur de ligne
dans le flux
16

RGUMENTS DE LA LIGNE DE
COMMANDE

Notre programme LecteurOctets stocke le nom


du fichier abc.gif directement dans son code (le
nom de fichier est crit en dur dans le
programme).

Cela signifie que, pour crer un programme


similaire qui lit le fichier xyz.gif, tu dois modifier
le code et recompiler le programme, ce qui n'est
pas agrable.

Il vaudrait mieux passer le nom du fichier depuis


la ligne de commande, lors du lancement du
programme.

17

RGUMENTS DE LA LIGNE DE
COMMANDE

On peux excuter tous les programmes Java avec


des arguments de ligne de commande, par
exemple : java LecteurOctets xyz.gif

Dans cet exemple, nous passons la mthode


main() de LecteurOctets un seul argument xyz.gif.

La mthode main() a un argument :(String[]


arguments)un tableau de String que Java passe
la mthode main().

18

RGUMENTS DE LA LIGNE DE
COMMANDE

si on lance un programme sans aucun argument


sur la ligne de commande, ce tableau est vide.
Dans le cas contraire, le nombre
d'lments de ce tableau est exactement le mme
que celui des arguments passs au programme sur
la ligne de
commande.

Voyons comment utiliser ces arguments de ligne


de commande dans une classe trs simple qui
ne
fait que les afficher

19

public class TestArguments


{
public static void main(String[] arguments)
{ // Combien d'arguments m'a-t-on fourni ?
int nombreArguments = arguments.length;
for (int i = 0; i < nombreArguments; i++)
{ System.out.println("On m'a fourni " +
arguments[i]); }
}
}

20

RGUMENTS DE LA LIGNE DE
COMMANDE
La capture d'cran suivante montre ce qu'il se
passe si on excute ce programme avec deux
arguments xyz.gif et 250.4

La valeur xyz.gif est place par


Java dans l'lment arguments[0] et la
seconde dans arguments[1].

21

RGUMENTS DE LA LIGNE DE
COMMANDE

Les arguments de la ligne de commande sont


toujours passs un programme comme des
Strings. Il est de la responsabilit du programme
de convertir les donnes dans le type de donnes
appropri. Par exemple :

int monScore =
Integer.parseInt(arguments[1]);

22

C'est toujours une bonne chose de vrifier si la


ligne de commande contient le bon nombre
d'arguments.
On doit le signaler en affichant un message bref
et s'arrter immdiatement en utilisant la
mthode spciale System.exit():

Exemple:
public static void main(String[] arguments)
{ if (arguments.length != 2)
{ System.out.println( "Merci de fournir deux
arguments, par exemple :java
TestArguments xyz.gif 250");
// Sortie du programme
System.exit(0);
}}

23

A la fin de ce chapitre, on devra crire un


programme qui copie des fichiers. Pour que ce
programme fonctionne avec n'importe quels
fichiers, les noms des fichiers source et
destination doivent tre passs au programme en
tant qu'arguments de la ligne de commande.

On peut tester les programmes dans Eclipse, qui


permet aussi de fournir des arguments de ligne
de commande tes programmes. Dans la
fentre
Excuter,
slectionne
l'onglet (x)=Arguments et entre les valeurs
requises dans la bote Arguments de
programme.

24

25

LECTURE

DE FICHIERS

TEXTE
Java utilise des caractres de deux octets
pour stocker les lettres (code unicode).

Les classes FileReader et FileWriter


sont trs pratiques pour
travailler avec des
fichiers texte.

Ces classes peuvent lire un fichier


texte, soit caractre
par
caractre

l'aide de la mthode read(), soit ligne par


ligne l'aide de la mthode readLine().
Les classes FileReader et FileWriter ont aussi
leurs
contreparties
BufferedReader
et
BufferedWriter pour acclrer le travail avec
des fichiers.

26

LECTURE

DE FICHIERS

TEXTE
Exemple: A l'aide d'un diteur de texte
quelconque, on cre le fichier c:\scores.txt avec
le contenu suivant :
David 235
Daniel 190
Anna 225
Gregory 160
Ecrire la classe LecteurScores qui lit le fichier
scores.txt ligne ligne.
le programme se termine quand la mthode
readLine() renvoie null, ce qui signifie la fin du
fichier.

27

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class LecteurScores
{ public static void main(String[] arguments)
{ FileReader monFichier=null; BufferedReader tampon=null;
try { monFichier = new FileReader("c:\\scores.txt"); tampon
= new BufferedReader (monFichier);
while (true) { // Lit une ligne de scores.txt
String ligne = tampon.readLine();
// Vrifie la fin de fichier if (ligne == null)
break; System.out.println(ligne); } // Fin
du while
} catch (IOException exception) {
exception.printStackTrace();
} finally { try { tampon.close(); monFichier.close(); }
catch(IOException exception1) {
exception1.printStackTrace(); } }
} // Fin de main }

28

LECTURE

DE FICHIERS

TEXTE

Si le programme doit crire un fichier texte sur un


disque, on utilise la mthodes write() de la classe
FileWriter.

FileWriter possde plusieurs constructeurs


surchargs.

FileWriter fichierSortie = new


FileWriter("c:\\scores.txt");
29

LECTURE

DE FICHIERS

TEXTE

Si on souhaite ajouter des donnes la fin d'un


fichier existant, on utilise le constructeur deux
arguments (true signifie ici mode ajout) :

FileWriter fichierSortie = new


FileWriter("c:\\scores.txt", true);

Exemple: La classe EnregistreurScores crit


trois lignes dans le fichier c:\scores.txt partir
du tableau scores.
30

import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
public class EnregistreurScores
{ public static void main(String[] arguments)
{ FileWriter monFichier = null;
BufferedWriter tampon = null;
String[] scores = new String[3];
// Entre des scores dans le tableau
scores[0] = "M. Dupont 240";
scores[1] = "M. Durand 300";
scores[2] = "M. Pemieufer 190";

31

try
{ monFichier = new FileWriter("c:\\scores.txt");
tampon = new BufferedWriter(monFichier);
for (int i = 0; i < scores.length; i++) {
// Ecrit le tableau de chanes dans scores.txt
tampon.write(scores[i]);
System.out.println("Ecriture de : " + scores[i]); }
System.out.println("Ecriture du fichier
termine"); }
catch (IOException exception)
{ exception.printStackTrace(); }
finally { try { tampon.flush(); tampon.close();
monFichier.close(); } catch (IOException e1) {
e1.printStackTrace(); } }
32
} // Fin de main }

LECTURE

DE FICHIERS

TEXTE

La sortie de ce programme est :

Ecriture
Ecriture
Ecriture
Ecriture

de
de
de
du

: M. Dupont 240
: M. Durand 300
: M. Pemieufer 190
fichier termine.

33

CLASSE FILE (FICHIER)

La classe java.io.File fournit de nombreuses


mthodes utiles, qui permettent de renommer un
fichier, de supprimer un fichier, de vrifier si le
fichier existe, etc.

Soit un programme qui enregistre des donnes


dans un fichier et qu'il ait besoin d'afficher un
message pour avertir l'utilisateur si ce fichier
existe dj.
34

CLASSE FILE (FICHIER)


Pour ce faire, on doit crer une instance de l'objet
File en lui donnant le nom du fichier, puis
appeler la mthode exists().

Si cette mthode retourne true, le fichier


a t trouv et on doit afficher un message
d'avertissement. Sinon, c'est que ce fichier
n'existe pas.

Exemple:
File unFichier = new File("abc.txt");
if (unFichier.exists()) {
// Affiche un message davertissement. }

35

CLASSE FILE (FICHIER)

Le constructeur de la classe File ne cre pas


rellement un fichier

il cre juste en mmoire une instance de cet objet


qui pointe sur le fichier rel.

Si on veut vraiment crer un fichier sur le


disque, on utilise la mthode createNewFile().

36

Nom de la mthode

Fonctionnalit

Cre un(nouveau
fichier, vide,
du nom utilis
CLASSE FILE
)
FICHIER
pour l'instanciation de la classe File.

Boolean
createNewFile()

Boolean delete()

Supprime un fichier ou un rpertoire.

Boolean renameTo()

Renomme un fichier.

Long length()

Retourne la longueur d'un fichier en octets.

Boolean exists()

Retourne true si le fichier existe.

String[] list()

Retourne un tableau de chanes contenant les


noms des fichiers/rpertoires contenus dans un
rpertoire donn.

Boolean mkDir()

Cre un rpertoire.

String
getAbsolutePath()
String getPath()

renvoie le chemin absolu du fichier

boolean isFile()

indique si l'objet reprsente un fichier

boolean canRead()

indique si le fichier peut tre lu

boolean canWrite()

indique si le fichier peut tre modifi

boolean isDirectory()

indique si le fichier est un rpertoire

boolean isFile()

indique si l'objet reprsente un fichier

renvoie le chemin du fichier

37

CLASSE FILE (FICHIER)

L'extrait de code ci-dessous renomme le fichier


clients.txt en clients.txt.bak. Si le fichier .bak
existe dj, il est remplac.

Exemple:
File fichier = new File("clients.txt");
File sauvegarde = new File("clients.txt.bak"); if
(sauvegarde.exists())
{ sauvegarde.delete(); }
fichier.renameTo(sauvegarde);

38

MERCI

39

Você também pode gostar