Vous êtes sur la page 1sur 37

Programmation orient objet JAVA

Quatrime partie

JAVA Programmation oriente objet

Pr Hafidi Imad
1 Hafidi Imad -ENSA de Khouribga-Cours JAVA

imad.hafidi@gmail.com

Entres/sorties

Hafidi Imad -ENSA de Khouribga-Cours JAVA

Les entres / sorties


Dans la plupart des langages de programmation les notions d'entres / sorties sont considres comme une technique de base, car les manipulations de fichiers, notamment, sont trs frquentes. En Java, et pour des raisons de scurit, on distingue deux cas :
le cas des applications Java autonomes, o, comme dans n'importe quel autre langage, il est gnralement fait un usage important de fichiers, le cas des applets Java qui, ne peuvent pas, en principe, accder, tant en criture qu'en lecture, aux fichiers de la machine sur laquelle s'excute le navigateur (machine cliente).
3 Hafidi Imad -ENSA de KhouribgaCours JAVA

La gestion des fichiers (1)


La gestion de fichiers proprement dite se fait par l'intermdiaire de la classe File. Cette classe possde des mthodes qui permettent d'interroger ou d'agir sur le systme de gestion de fichiers du systme d'exploitation. Un objet de la classe File peut reprsenter un fichier ou un rpertoire.

Hafidi Imad -ENSA de KhouribgaCours JAVA

La gestion des fichiers (2)


Voici un aperu de quelques constructeurs et mthodes de la classe File :
File (String name) File (String path, String name) File (File dir, String name) boolean isFile( ) / boolean isDirectory( ) boolean mkdir( ) boolean exists( ) boolean delete( ) boolean canWrite( ) / boolean canRead( ) File getParentFile( ) long lastModified( )
5 Hafidi Imad -ENSA de KhouribgaCours JAVA

La gestion des fichiers (3)


import java.io.*; public class Listeur { public static void main(String[] args) { litrep(new File(".")); } public static void litrep(File rep) { if (rep.isDirectory()) { //liste les fichier du rpertoire String t[]=rep.list(); for (int i=0;i<t.length;i++) System.out.println(t[i]); } } }6 Les objets et classes relatifs la gestion des fichiers se trouvent dans le package java.io A partir du chemin d'un dossier ou d'un fichier, on peut crer un objet File : ici on va lister le rpertoire courant ( . ) Les mthodes isFile() et isDirectory() permettent de dterminer si mon objet File est une fichier ou un rpertoire

Hafidi Imad -ENSA de KhouribgaCours JAVA

La gestion des fichiers (4)


import java.io.*; public class Listeur { public static void main(String[] args) { litrep(new File( "c:\\"));} public static void litrep(File rep) { File r2; if (rep.isDirectory()) {String t[]=rep.list(); for (int i=0;i<t.length;i++) { r2=new File(rep.getAbsolutePath()+"\\"+t[i]); if (r2.isDirectory()) litrep(r2); else System.out.println(r2.getAbsolutePath()); }} }} 7 Le nom complet du fichier est rep\fichier Pour chaque fichier, on regarde s'il est un rpertoire. Si le fichier est un rpertoire litrep s'appelle rcursivement elle-mme

Hafidi Imad -ENSA de KhouribgaCours JAVA

Notion de flux (1)


Les E / S sont gres de faon portable (selon les OS) grce la notion de flux (stream en anglais). Un flux est en quelque sorte un canal dans lequel de l'information transite. L'ordre dans lequel linformation y est transmise est respect. Un flux peut tre :
Soit une source doctets partir de laquelle il est possible de lire de l'information. On parle de flux d'entre. Soit une destination doctets dans laquelle il est possible d'crire de l'information. On parle de flux de sortie.

Hafidi Imad -ENSA de KhouribgaCours JAVA

Notion de flux (2)


Certains flux de donnes peuvent tre associs des ressources qui fournissent ou reoivent des donnes comme :
les fichiers, les tableaux de donnes en mmoire, les lignes de communication (connexion rseau)

Hafidi Imad -ENSA de KhouribgaCours JAVA

Notion de flux (3)


L'intrt de la notion de flux est qu'elle permet une gestion homogne :
quelle que soit la ressource associe au flux de donnes, quel que soit le flux (entre ou sortie).

Certains flux peuvent tre associs des filtres


Combins des flux dentre ou de sortie, ils permettent de traduire les donnes.

10

Hafidi Imad -ENSA de KhouribgaCours JAVA

Notion de flux (4)


Les flux sont regroups dans le paquetage java.io Il existe de nombreuses classes reprsentant les flux
il n'est pas toujours ais de se reprer.

Certains types de flux agissent sur la faon dont sont traites les donnes qui transitent par leur intermdiaire :
E / S bufferises, traduction de donnes,

Il va donc sagir de combiner ces diffrents types de flux pour raliser la gestion souhaite pour les E / S.

11

Hafidi Imad -ENSA de KhouribgaCours JAVA

Flux d'octets et flux de caractres


Il existe des flux de bas niveau et des flux de plus haut niveau (travaillant sur des donnes plus volues que les simples octets). Citons :
Les flux de caractres
classes abstraites Reader et Writer et leurs sous-classes concrtes respectives.

Les flux doctets


classes abstraites InputStream et OutputStream et leurs sous-classes concrtes respectives,

12

Hafidi Imad -ENSA de KhouribgaCours JAVA

Lecture de fichier
import java.io.*; public class LireLigne A partir du chemin d'un dossier ou d'un { fichier, on peut crer un objet FileReader public static void main(String[] args) puis partir ce celui-ci, { on cre 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(); Dans l'objet BufferedReader } on dispose d'une mthode catch (Exception e) readLine() {System.out.println("Erreur "+e);} } }
13 Hafidi Imad -ENSA de KhouribgaCours JAVA

Ecriture dans un fichier


import java.io.*; public class Ecrire A partir du chemin d'un dossier ou d'un { fichier, on peut crer un objet FileWriter public static void main(String[] args) puis partir ce celui-ci, { on cre un BufferedReader try { 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(); } catch (Exception e) Attention, lorsque l'on a crit, il { System.out.println("Erreur "+e);} ne faut pas oublier de fermer le }} fichier
14 Hafidi Imad -ENSA de KhouribgaCours JAVA

La hirarchie des flux d'octets en entre

15

Hafidi Imad -ENSA de KhouribgaCours JAVA

La hirarchie des flux d'octets en sortie

16

Hafidi Imad -ENSA de KhouribgaCours JAVA

Les flux doctets


Classe DataInputStream
sous classes de InputStream permet de lire tous les types de base de Java.

Classe DataOutputStream
sous classes de OutputStream permet d'crire tous les types de base de Java.

Classes ZipOutputStream et ZipInputStream


permettent de lire et d'crire des fichiers dans le format de compression zip.

17

Hafidi Imad -ENSA de KhouribgaCours JAVA

La classe InputStream (1)


Un InputStream est un flux de lecture doctets. InputStream est une classe abstraite.
Ses sous-classes concrtes permettent une mise en uvre pratique. Par exemple, FileInputStream permet la lecture d'octets dans un fichier.

18

Hafidi Imad -ENSA de KhouribgaCours JAVA

La classe InputStream (2)


Les mthodes principales qui peuvent tre utilises sur un InputStream sont :
public abstract int read () throws IOException qui retourne loctet lu ou -1 si la fin de la source de donnes est atteinte. C'est cette mthode qui doit tre dfinie dans les sousclasses concrtes et qui est utilise par les autres mthodes dfinies dans la classe InputStream. int read (byte[ ] b) qui emplit un tableau doctets et retourne le nombre doctets lus int read (byte [] b, int off, int len) qui emplit un tableau d octets partir d une position donne et sur une longueur donne,
19 Hafidi Imad -ENSA de KhouribgaCours JAVA

La classe InputStream (3)


Les mthodes principales qui peuvent tre utilises sur un InputStream sont (suite) :
void close () qui permet de fermer un flux,
Il faut fermer les flux ds qu'on a fini de les utiliser. En effet, un flux ouvert consomme des ressources du systme d'exploitation qui sont en nombre limit.

20

Hafidi Imad -ENSA de KhouribgaCours JAVA

La classe InputStream (4)


Les mthodes principales qui peuvent tre utilises sur un InputStream sont (suite) :
int available () qui retourne le nombre doctets prts tre lus dans le flux,
Attention : Cette fonction permet d'tre sr qu'on ne fait pas une tentative de lecture bloquante. Au moment de la lecture effective, il se peut quil y ait plus doctets de disponibles.

long skip (long n) qui permet dignorer un certain nombre doctets en provenance du flot. Cette fonction renvoie le nombre d'octets effectivement ignors.

21

Hafidi Imad -ENSA de KhouribgaCours JAVA

La classe OutputStream (1)


Un OutputStream est un flot dcriture doctets. La classe OutputStream est abstraite. Les mthodes principales qui peuvent tre utilises sur un OutputStream sont :
public abstract void write (int) throws IOException qui crit loctet pass en paramtre, void write (byte[] b) qui crit les octets lus depuis un tableau doctets, void write (byte [] b, int off, int len) qui crit les octets lus depuis un tableau d octets partir d une position donne et sur une longueur donne,

22

Hafidi Imad -ENSA de KhouribgaCours JAVA

La classe OutputStream (2)


Les mthodes principales qui peuvent tre utilises sur un OutputStream sont (suite) :
void close () qui permet de fermer le flux aprs avoir ventuellement vid le tampon de sortie, flush () qui permet de purger le tampon en cas d'critures bufferises.

23

Hafidi Imad -ENSA de KhouribgaCours JAVA

Empilement de flux filtrs (1)


En Java, chaque type de flux est destin raliser une tche. Lorsque le programmeur souhaite un flux qui ait un comportement plus complexe
"empile", la faon des poupes russes, plusieurs flux ayant des comportements plus lmentaires.
On parle de flux filtrs.

Concrtement, il s'agit de passer, dans le constructeur d'un flux, un autre flux dj existant pour combiner leurs caractristiques.

24

Hafidi Imad -ENSA de KhouribgaCours JAVA

Empilement de flux filtrs (2)


FileInputStream
permet de lire depuis un fichier mais ne sait lire que des octets.

DataInputStream
permet de combiner les octets pour fournir des mthodes de lecture de plus haut niveau (pour lire un double par exemple), mais ne sait pas lire depuis un fichier.

Une combinaison des deux permet de combiner leurs caractristiques :


FileInputStream fic = new FileInputStream ("fichier"); DataInputStream din = new DataInputStream (fic); double d = din.readDouble ();
25 Hafidi Imad -ENSA de KhouribgaCours JAVA

Empilement de flux filtrs (3)


Lecture bufferise de nombres depuis un fichier DataInputStream din = new DataInputStream(new BufferedInputStream( new FileInputStream ("monfichier"))); Lecture de nombre dans un fichier au format zip ZipInputStream zin = new ZipInputStream ( new FileInputStream ("monfichier.zip")); DataInputStream din = new DataInputStream (zin);

26

Hafidi Imad -ENSA de KhouribgaCours JAVA

Constructeurs de flux (1)


Classe FileInputStream
FileInputStream (String name) FileInputStream (File f)

Classe FileOutputStream
FileOutputStream (String name) FileOutputStream (String name, boolean append) FileOutputStream (File f)

27

Hafidi Imad -ENSA de KhouribgaCours JAVA

Constructeurs de flux (2)


Classe BufferedInputStream
BufferedInputStream (InputStream in) BufferedInputStream (InputStream in, int n)

Classe BufferedOutputStream
BufferedOutputStream (OutputStream out) BufferedOutputStream (OutputStream out, int n)

28

Hafidi Imad -ENSA de KhouribgaCours JAVA

Flux de fichiers accs direct (1)


La classe RandomAccessFile
permet de lire ou d'crire dans un fichier n'importe quel emplacement (par opposition aux fichiers accs squentiels).

Elle implmente les interfaces DataInput et DataOutput


permettent de lire ou d'crire tous les types Java de base, les lignes, les chanes de caractres ascii ou unicode, etc ...

29

Hafidi Imad -ENSA de KhouribgaCours JAVA

Flux de fichiers accs direct (2)


Un fichier accs direct peut tre
ouvert en lecture seule (option "r") ou en lecture / criture (option "rw").

Ces fichiers possdent un pointeur de fichier qui indique constamment la donne suivante.
La position de ce pointeur est donne par long getFilePointer () et celui-ci peut tre dplac une position donne grce seek (long off).

30

Hafidi Imad -ENSA de KhouribgaCours JAVA

Les flux de caractres (1)


Ce sont des sous-classes de Reader et Writer. Ces flux utilisent le codage de caractres Unicode. Exemples
conversion des caractres saisis au clavier en caractres dans le codage par dfaut
InputStreamReader in = new InputStreamReader (System.in);

Conversion des caractres d un fichier avec un codage explicitement indiqu


InputStreamReader in = new InputStreamReader ( new FileInputStream ("chinois.txt"), "ISO2022CN");
31 Hafidi Imad -ENSA de KhouribgaCours JAVA

Les flux de caractres (2)


Pour crire des chanes de caractres et des nombres sous forme de texte
on utilise la classe PrintWriter qui possde un certain nombre de mthodes print (...) et println (...).

Pour lire des chanes de caractres sous forme texte, il faut utiliser, par exemple,
BufferedReader qui possde une mthode readLine() .
Pour la lecture de nombres sous forme de texte, il n'existe pas de solution toute faite : il faut par exemple passer par des chanes de caractres et les convertir en nombres.

32

Hafidi Imad -ENSA de KhouribgaCours JAVA

La hirarchie des flux de caractres

33

Hafidi Imad -ENSA de KhouribgaCours JAVA

Les flux de donnes prdfinis (1)


Il existe 3 flux prdfinis : l'entre standard System.in (instance de InputStream) la sortie standard System.out (instance de PrintStream) la sortie standard d'erreurs System.err(instance de PrintStream)
try { char c; while((c = System.in.read()) != -1) { System.out.print(c); } } catch(IOException e) { System.out.print(e); }
34 Hafidi Imad -ENSA de KhouribgaCours JAVA

Les flux de donnes prdfinis (2)


La classe InputStream ne propose que des mthodes lmentaires. Prfrez la classe BufferedReader.qui permet de rcuprer des chanes de caractres.
try { Reader reader = new InputStreamReader(System.in); BufferedReader keyboard = new BufferedReader(reader); System.out.print("Entrez une ligne de texte : "); String line = keyboard.readLine(); System.out.println("Vous avez saisi : " + line); } catch(IOException e) { System.out.print(e);}
35 Hafidi Imad -ENSA de KhouribgaCours JAVA

La srialisation
La srialisation consiste prendre un objet en mmoire et en sauvegarder l'tat sur un flux de donnes (vers un fichier, par exemple). Ce concept permet aussi de reconstruire, ultrieurement, l'objet en mmoire l'identique de ce qu'il pouvait tre initialement. La srialisation peut donc tre considre comme une forme de persistance des donnes. 2 classes ObjectInputStream et ObjectOutputStream proposent, respectivement, les mthodes readObjet et writeObject Par dfaut, les classes ne permettent pas de sauvegarder l'tat d'un objet sur un flux de donnes. Il faut implmenter l'interface java.io.Serializable. Hafidi Imad -ENSA de Khouribga36 Cours JAVA

void sauvegarde(String s) { try {FileOutputStream f = new FileOutputStream(new File(s)); ObjectOutputStream oos = new ObjectOutputStream(f); oos.writeObject(this); oos.close();} catch (Exception e) { System.out.println("Erreur "+e);} } static Object relecture(String s) { try {FileInputStream f = new FileInputStream(new File(s)); ObjectInputStream oos = new ObjectInputStream(f); Object o=oos.readObject(); oos.close();} catch (Exception e) { System.out.println("Erreur "+e);} }37 Hafidi Imad -ENSA de KhouribgaCours JAVA

Exemple de srialisation