Vous êtes sur la page 1sur 200

Les concepts de la Programmation Oriente Objet en Java

Prawee Sriplakich
Prawee.Sriplakich@lip6.fr Ce support de cours est disponible sur http://www-src.lip6.fr/homepages/Prawee.Sriplakich/
mise a jour : 18/09/2006

Organisation
1. Introduction la technologie Java 2. Concepts POO (basiques) 3. Environnements de Dveloppement en Java. 4. Concepts POO (avancs) 5. Tableaux, collections et Map 6. Manipulation des entres/sorties 7. Threads et synchronisation 8. Manipulation des documents XML avec Java 4h

8h 6h 6h 6h 6h

2
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Evaluation
50% Contrle continu
Les TPs suivants seront valus :
4.3 : Ralisation des interfaces du mcanisme d'vnements 6.1 : Flux de donnes et srialisation 8.2 : Srialisation et dstatisation dobjets en XML avec DOM

Travail en binme Les critres dvaluation sont :


Lexplication sur le lancement du programme. La correction du programme. Le scnario de test couvrant toutes les fonctionnalits du programme La lisibilit du code et le commentaire sur le code. Le Java Doc et le document expliquant larchitecture globale du programme.

50% Examen (2h)


Les documents du cours et des notes personnelles sont autoriss.
3
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

1. Introduction la technologie Java

Java et une plateforme d'entreprise

Quest ce que Java ?


Un langage de programmation interprt et compil.
Java code Byte code Byte code est interprt par JVM (Java Virtual Machine)

Les applications Java s'excutent sur quel type de machines ?


Tous les types de matriels disposant d'une JVM

5
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Comment cela fonctionne t-il ?

La JVM fournit un environnement d'excution homogne (malgr l'htrognit des OS/ matriels)

6
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Le Java Development Kit


Java est un langage de programmation.

Le Java Development Kit est une boite outils :


un compilateur java une machine virtuelle JVM un ensemble de bibliothques (API) pour faciliter la programmation.
Ex. Gestion d'E/S (ficher, rseaux), les collections (liste, ensemble) , IHM

7
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Applets et applications
Deux types de dveloppements sont possibles :
les Applets
Un programme s'excutant au sein d'un navigateur web. Tlchargeable en mme temps qu'une page web Pas besoin d'installation Fonctionnalit limit (par mesure de scurit)

les applications
Un programme standard s'excutant sur la JVM. Moins de restriction (Les utilisateurs doivent faire confiance avant de l'excuter)

8
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

La plate-forme entreprise java

Un grand nombre de bibliothques ont t dveloppes autour du langage Java Elles offrent des fonctionnalits communes des applications d'entreprises
Ex. Gestion de web, de base de donnes, de transactions etc. Simplicit du dveloppement des applications complexes La

plateforme concurrence : .NET


9

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

2. Concepts POO (basiques)


Contenu:
Class, Objet, Instanciation, Attribut, Mthode, Message (Invocation), Cycle de vie d'objets, Constructeur, Package
10

Class et objet
Objet
reprsente une entit dans le monde rel ou un lment du programme. Possde des tats et des comportements Ex. un objet "Tlvision"
ses tats = { allum/teint, chane courante, volume de son }, ses comportements = { allumer, changer de chane, changer de volume de son, teindre }

Class
Un objet est une instance d'une classe la classe dcrit l'objet. Description des tats des attributs de la classe Description des comportements des mthodes de la classe.
11
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple d'une class


public class Television { // Etat private int volume; private int chaine; private boolean estAllume; // Comportements public void allumer() { } public void eteindre() { } public void augmenterVolume() { } public void reduireVolume() { } public void changerChaine(int _chaine) { } }
NB. Par convention, les noms des classes commencent par majuscule ceux des attributs/ mthodes commence par minuscule
12
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Instanciation
Une classe peut tre rutilise pour instancier plusieurs objets
Class Television boolean estAllume int volume int chaine Objets estAllume: true volume: 5 chaine: 1

estAllume: true volume: 6 chaine: 2

estAllume: false volume: 0 chaine: 0


13
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Question
Dfinir une classe reprsentant des voitures.
Les tats des objets voiture doivent dcrire
Dmarr ou non, position de boite de vitesse, vitesse niveau d'essence,

Les comportements d'une voiture incluent:


Dmarrer, arrter Changer boite de vitesse Acclrer, ralentir Tourner (selon le dgr spcifi)

14
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Solution
public class voiture { private boolean estDemarre; private int posBoiteVitesse; private int vitesse; private int niveauEssence; public void demarrer() { } public void arreter() { } public void setPosBoiteVitesse(int pos) { } public void accelerer() { } public void ralentir() { } public void tourner(int degre) { } }
15
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Le typage d'attributs (et variables)


Un attribut peut tre typ : par une classe (Sa valeur est donc une rfrence vers un objet instance de cette classe) par un type primitif:
boolean, short, int, long, float, double byte, char.

Par un tableau de type primitif, ou de type classe


Ex. int[] att1; Television[] att2; Un array est un objet

NB. Une chaine de caractres est un objet instance de la class String


16
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Mthodes
Le corps d'une mthode contient des instructions comme la programmation classique. Il peut accder aux attributs de la classe Ex. public void changerChaine(int _chaine) { if(_chaine<0 || _chaine>108) { System.out.println("chane invalide "); } else { chaine = _chaine; // Accs l'attribut chaine } }
17
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Attribut "this"
Lorsque des variables locales portent les mmes noms que les attributs de la classe, vous devez utiliser l'attribut "this" pour les distinguer. Ex. public void changerChaine(int chaine) { if(chaine<0 || chaine>108) { System.out.println("chane invalide "); } else { this.chaine = chaine; // this.chaine signifie l'attribut de la classe } }
18
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Interaction entre objets: messages


Lors qu'un programme s'excute, il comporte d'un ensemble d'objets et ces objets changent des messages. Echange de messages = invocation d'une mthode Les paramtres sont envoy dans le message. un telecommande une television

changerDeChaine(3)
19
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Interaction entre objets : via rfrence entre objets


Afin qu'un objet A puisse invoquer une mthode de l'objet B, A doit avoir une rfrence vers B. Ex.
public class Telecommande { Television t; // une rfrence (un attribut) . public void boutonChaineAppuye(int boutonNo) { t.changerChaine(boutonNo); // invocation } }
20
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Question
Dfinir une classe Messenger
Un objet Messenger reprsente une messagerie d'un utilisateur. Il porte un identifiant, celui de l'utilisateur Il rfrence des objets Messenger auxquels il peut envoyer un message. On peut lui ajouter un contact. Il accepte un texte de l'utilisateur et le diffuse aux autres. Lors de la rception du texte diffus, il l'affiche sur l'cran
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

julien

julie

pierre

21

Solution
import java.util.Vector; public class Messenger { private String idUtilisateur; private Vector<Messenger> contacts = new Vector<Messenger>(); public void ajouterContact(Messenger contact) { contacts.add(contact) } public void diffuser(String texte) { for(int i=0; i< contacts.size(); i++) { Messenger contact = contacts.get(i); contact.recevoir(texte); } } public void recevoir(String texte) { System.out.println(idUtilisateur + " recoit: " + texte); } }
22
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Comment commencer le programme: Mthode main


Un programme Java = un ensemble de classes. Une mthode main doit tre dfinie dans une des classes. Elle doit avoir la signature:
public static void main(String[] args) Le tableau <<args>> contient des paramtres passs par la commande d'excution d'application
Ex. java MyAppli p1 p2 p3
args est donc {"p1", "p2", "p3"}

23
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Un exemple de la classe main


public class ClasseMain { public static void main(String[] args) {
// creation d'objets

Voiture v = new Voiture(); Personne p = new Personne();


// dclancher interaction entre objets

p.conduire(v); } }

En gnral, la mthode main sert :


Configurer le programme: (crer des objets initiaux du programme) Dclencher l'interaction entre ces objets

24
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Cycle de vie d'objets : cration


Pendant l'excution du programme, les objets peuvent tre cres et dtruits de manire dynamique. La cration d'un objet se fait par l'oprateur new suivi par le nom d'une classe
Ex new Voiture() Voiture() est en effet une mthode spciale, appele le "constructeur de la classe".

Le constructeur peut avoir des paramtres permettant de spcifier l'tat initial de l'objet
Ex. new File("document1.doc") // crer un objet reprsentant un ficher "document.doc".

25
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple d'un constructeur


public class Messenger { private String idUtilisateur; public Messenger(String _idUtilisateur) { idUtilisateur = _idUtilisateur; } . }

26
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Cycle de vie d'objets : objets en cours d'utilisation


L'objet en cours d'utilisation doit tre rfrenc par une variable et un attribut. (sinon on ne pourrait pas l'utiliser !!)
Ex. Voiture v = new Voiture(); // L'objet cr est rfrenc par la variable v.

Un objet peut tre rfrenc par plusieurs variables


Ex. Voiture v1 = new Voiture(); Voiture v2 = v1; // v1 et v2 rfrencent le mme objet.

Pour utiliser l'objet, on invoque les mthodes de l'objet


Ex. v1.demarrer(); // <<v2.demarrer()>> donnera le mme effet car elle rfrence le mme objet
27
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Cycle de vie d'objets : destruction


Les objets non rfrencs sont automatiquement dtruits
Ex1. Voiture v = new Voiture(); v = null; // v ne rfrence plus l'objet, donc il sera dtruit Ex2. public void m() { Voiture v = new Voiture(); } // v n'existe pas en dehors de la mthode, donc l'objet sera dtruit la fin dexcution de la mthode
28
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Question
L'objet rfrenc par v sera-il dtruit la fin excution de m() ? public class VoitureManager { Voiture[] voitures = new Voiture[10]; .. public void m() { Voiture v = new Voiture(); voitures[3] = v; v = null; } }

29
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Question
Reprendre l'application Messenger, crire la mthode main (dans une classe Main) servant commencer le programme. La mthode main doit configurer 3 objets Messenger (pour Pierre, Julie, Julien) avec les liens entre eux. Elle dclenche l'application en demandant Pierre de diffuser un texte.
30
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Solution
public class Main { public static void main(String[] args) { Messenger pierre = new Messenger("pierre"); Messenger julie = new Messenger("julie"); Messenger julien = new Messenger("julien"); pierre.ajouterContact(julie); pierre.ajouterContact(julien); . // similaire pour julie et julien pierre.diffuser("runion demain 10h"); } }
31
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Organisation d'application: package


Une application peut contenir un grand nombre de classes.
Un package permet de grouper un ensemble de classes reprsentant un module d'application modularit

Hirarchie de packages:
Un package peut contenir non seulement des classes mais galement des sous packages Ex. mon_appli.ihm.client est une hirarchie de 3 packages

Espace de nommage
Differents packages peuvent avoir chacun une classe portant le mme nom. Ex. La classe "Client" du package "com.ibm" est diffrente de la classe "Client" du package "com.microsoft"
com.ibm.Client vs. com.microsoft.Client

Eviter le conflit de noms lors de l'intgration de plusieurs modules d'une application.


32
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Organisation des classes dans les packages


Chacune des classes est un fichier. Les fichiers doivent tre placs dans le bon rpertoire selon le package Dans chaque classe, on dclare le package au dbut du fichier
Mot cl: package

Ex. La classe ProductBrowser est dans le package mon_appli.ihm.client

33
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Spcification de classes dans les autres packages


Dans le code d'une classe, une autre classe dans un autre package peut tre spcifi avec la forme p1.p2.NomClass Cette forme est appele <<nom qualifi>> d'une classe Ex.

package mon_appli.ihm.client; public class ProductBrowser { mon_appli.bd.ProductSearcher ps; . }

34
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Spcification de classes dans les autres packages avec <<import>>


On peut viter de rpter le nom qualifi plusieurs fois grce la dclaration <<import>> On peut importer une seule classe d'un package ou toutes ses classes Ex. : importer toutes les classes dans le package mon_appli.bd.

package mon_appli.ihm.client; import mon_appli.bd.*; public class ProductBrowser { ProductSearcher ps; ProductSearcher ps2; . }
35
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

3. Environnements de Dveloppement en Java


Contenu:
IDE, Complication, Excution, Dbuggage, Gnration de documentation, Dploiement

36

Environnement classique et IDE


Deux faons de dvelopper: Environnement classique
Complication/ execution par ligne de commande javac *.java : compiler des fichiers Java. java [nom de la classe main] : excuter l'application

IDE (Integrated Development Environment)


Facilits
Complication automatique Soulignements d'erreurs syntaxiques Dbuggage avec interface graphique

Ex. Eclipse

37
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Utilisation d'environnement classique


Crer des classes avec votre diteur prfr (Emac, Bloc-note) Mettre des classes dans les rpertoires hirarchiques selon leur package. Ouvrir la console de commande Positionner au rpertoire racine (contenant les packages du plus haut niveau)
Dans l'exemple de mon_appli, ce rpertoire contient le rpertoire mon_appli

Complier: javac [une liste des fichiers Java]


Ex: javac mon_appli/bd/*.java mon_appli/ihm/client/*.java mon_appli/ihm/admin/*.java

Excuter: java [le nom qualifi la classe main]


Ex. java mon_appli.ihm.client.ProductBrowser NB. il faut positionner dans le bon rpertoire (pour que la JVM puisse trouver les classes ncessaires)

38
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Utilisation de lDE Eclipse


Crer un projet
File New projet

Crer des classes dans le rpertoire source (par dfaut c'est le rpertoire du projet)
File New class

La complication se fait automatiquement lors de la sauvegarde des classes.


Les erreurs syntaxiques sont soulignes

Excution
Slectionner la classe <<main>> Cliquer droit Run as Java Application

39
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Dbuggage
Le dbuggage permet d'analyser le comportement du programme lors de son excution
Dcouvrir des erreurs.

L'ide consiste arrter un programme un moment donn et examiner l'tat des objets du programme. Debuggeur: un JVM qui offre le moyen d'arrter l'excution du programme une ligne spcifie (appel point d'arrt).
Ex.
jdb (IHM ligne de commande) usage: jdb [nom de la classe main] Eclipse (IHM graphique) usage: slectionner la classe main, cliquer droite Debug as Java Application

Diffrentes manires pour reprendre l'excution


Passer la ligne suivante ("step over") Entrer dans le code de la mthode qui va tre invoque ("step into") Excuter juste la fin de la mthode et retourner l'objet invoquant la mthode ("step return") Excuter juste au point d'arrt suivant ("resume")

40
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Dbuggage avec Eclipse

Contrle de la reprise d'excution Etat des objets et variable locales La pile d'invocation (qui appelle qui)

Point d'arrt

41
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Documentation (javadoc)
La documentation facilite l'entretien de logiciel.
Rutiliser, corriger des erreurs, faire voluer, etc.

Un exemple: la documentation des classes standard Java


http://java.sun.com/j2se/1.4.2/docs/api/

On peut gnrer automatiquement le document partir du code source


Mais il faut mettre des commentaires sur le code source !

Ex. La classe String offre la mthode subString() permettant d'extraire une partie de la chane de caractres.
42
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Question : utilisation de la documentation


Chercher la description de la classe Integer
Quelle mthode permet de convertir une chane de caractres vers un nombre entier (int) ?

Chercher la classe Characters


Quelle mthode permet de tester si un caractre est minuscule ou majuscule

Chercher la classe StringTokenizer


Ecrire un programme permettant de couper une phrase en mots et les afficher (un mot par ligne). Conseil : mthodes hasMoreToken(), nextToken()
String: "chercher une class" afficher chercher une class
43
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Documentation: ajouter des commentaires au code


Entre /** Mot cl:
@param, @return, @exception

*/ (et non /* */ ).

Devant la dclaration d'une classe, d'une mthode, ou d'un attribut

44
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Documentation: la gnration
Avec ligne de commande
javadoc [fichiers Java]

Avec Eclipse
Slectionner le package Cliquer droite Export Javadoc

Il est conseill de rendre le javadoc gnr dans le compte rendu du contrle continu.

45
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Dploiement
dploiement d'applications sous forme de fichiers d'archivage (JAR) Un fichier jar ressemble un fichier ZIP. Il contient:
Des classes compiles Du code source (optionnel) Des donnes ncessaires pour l'application (ex. images, donnes de configuration)

Comment crer un fichier JAR


Ligne de commande
jar cvf [liste des fichiers]

Eclipse
Slectionner le package Cliquer droite Export JAR file

46
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Dploiement: comment utiliser le fichier JAR ? Pour excuter la classe main localis dans un fichier jar, il faut dire la JVM de chercher la classe dans ce fichier Utiliser le paramtre cp (classpath)
Ex. java -cp messenger.jar poo.messenger.Main

47
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 3.1 Cration et excution d'une application


Crer l'application Messenger avec Eclipse

48
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 3.2 Dbuggage
Dbugger l'application Messenger avec Eclipse Mettre le point d'arrt sur
pierre.ajouterContact(julien);

Examiner les 3 objets messenger Utiliser le contrle de la reprise d'excution pour entrer dans la classe Vector:
Comment la classe Vector stocke t-elle les objets Messenger? A quelle index du tableau l'objet sera-il ajout?

Fixer un autre point d'arrt


System.out.println(idUtilisateur + " recoit: " + texte); dans la mthode recevoir ()

Reprendre l'excution jusqu' ce point d'arrt ("resume") Examiner la pile d'invocation


Qu indique t-elle? Quel objet Messenger est-il en train de recevoir un texte ?

Refaire "resume" et observer la diffrence dans la pile d'invocation Dans chaque tape, faire la capture-cran et rpondre aux questions

49
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 3.3 Java Doc


Gnrer un javadoc de l'application Messenger avec Eclipse Ajouter des commentaires au code et rgnrer le javadoc

50
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

4. Concepts POO (avancs)


Contenu:
Hritage (Polymorphisme, Interface, Class abstraite, relation <<instance de>>, casting) Visibilit et encapsulation Attributs et Mthodes statiques Exception
51

Hritage
Une hritage est une relation entre deux classes. Ex. Etudiant hrite de Personne:
La classe tudiant et un sous-type (sous-classe) de la classe Personne (superclasse). Personne Object

Syntaxe: mot cl "extends"


public class Etudiant extends Personne { }

En Java, une classe ne peut pas hriter de plus d'une classe. Si l'hritage n'est pas dclar, la classe hrite implicitement de java.lang.Object

Etudiant

Enseignant

une hirarchie de classes

52
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Smantique d'hritage: attributs et mthodes


La sous classe (ex. Etudiant) possde des attributs et des mthodes dfinis dans la superclasse (ex. Personne). Ex.
public class Personne { String nom; public void envoyerMail( String adr, String message) { .} } } public class Etudiant extends Personne { String noEtudiant; Etudiant(String _nom, _noEtudiant) { nom = _nom; noEtudiant = _noEtudiant; envoyerMail("admin@univ.fr", "creation de dossier : " + nom); }

53
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Smantique d'hritage: redfinition


(autrement dit spcialisation, <<overriding>>) La sous classe peut redfinir les mthodes dj existant dans la superclasse. Les mthodes redfinies doivent garder la mme signature. Ex.
public class Personne { String nom; public void afficher() { System.out.println( "Personne : " + nom); } } public class Etudiant extends Personne { public void afficher() { System.out.println( "Etudiant : " + nom + " no: " + noEtudiant); } }
54
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Etude de cas: redfinition de la mthode equals()


Comparaison par identit
Deux variables de type objets sont gales si elles rfrencent le mme objet (oprateur ==) Ex.
String s1 = "hello"; String s2 = "hello"; String s3 = s1; System.out.println(s1 == s2); // false : pas le mme objet System.out.println(s1 == s3); // true

Comparaison par le contenu


Deux objets sont gaux si leur contenu se ressemble.

Personnalisation de comparaison
La classe Object propose la mthode <<boolean equals(Object unAutre)>> pour comparer deux objets. Elle peut tre redfinie pour personnaliser la faon de comparaison. Les classes standard Java (ex. String, Integer) redfibir equals() pour appliquer la comparaison par contenu.
Ex. System.out.println(s1.equals(s2)); // true

55
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple: redfinition de la mthode equals()


Object
public Personne { String noSecu; public boolean equals(Object autre) { if(autre instanceof Personne) { Personne p2 = (Personne) autre; if(noSecu.equals(p2.noSecu)) return true; } return false; } }
equals() { // comparer par identit }

Personne
equals() { // comparer par contenu (no de scu sociale) }

String
equals() { // comparer par contenu }

56
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Accs aux mthodes redfinies dans la superclass


Mme si la sous classe redfinit des mthodes de la superclasse, elle a le moyen d'accder ces mthodes en utilisant le mot cl <<super>>.
public class A { public A(String s) { System.out.println("A : " + s); } public void m1() { System.out.println("A.m1"); } public void m2() { System.out.println("A.m2"); } } // main B b= new B("hello"); b.m1(); public class B extends A { public B(String s) { super(s); System.out.println("B : " + s); } public void m1() { super.m1(); m2(); // pas besoin de faire super.m2(); System.out.println("B.m1"); } } Rsultat : A : hello B : hello A.m1 A.m2 B.m1
57
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Smantique d'hritage: Substituabilit


L'objet instance de la sous-classe peut se substituer l o l'objet instance de la superclasse est requis. Ex1.
Personne p = new Etudiant();

Ex.2.
Soit la mthode imprimerInfoPersonne() dfinit
public void imprimerInfoPersonne(Personne p) { }

Il est possible de passer l'objet Etudiant comme le paramtre.


Etudiant e = ; inprimante.imprimerInfoPersonne(e);

58
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

getClass() et instanceof : Retrouver le type objet.


Le problme:
methode(Object param) { // param est-il un Etudiant? un Enseignant? ou autre?. }

La solution:
getClass() : retrouver la classe d'objet
// obtenir le nom de la classe de l'objet System.out.println(param.getClass().getName());

Instanceof : tester le type d'objet


// supposant que param est instance de la classe Etudiant System.out.println(param instanceof Etudiant); // true System.out.println(param instanceof Personne); // true System.out.println(param instanceof Enseignant); // false
59
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Casting: convertir une variable vers un type plus spcifique


Le problme :
Object o = . ; if(o instanceof Etudiant) { // o.afficher(); illgal // Maintenant on sait que o est de type Etudiant, // mais comment invoquer la mthode afficher() // de la classe Etudiant? }

La solution: Casting.
Etudiant e = (Etudiant) o; // les variable e et o rfrencent le mme objet // mais elles sont de diffrents types. e.afficher();

60
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Smantique d'hritage: Polymorphisme


Le polymorphisme est le fait qu'une classe peut avoir plusieurs sousclasses.
Ex: Personne a comme sous-classes Etudiant et Enseignant.

Par principe de substituabilit, le programme qui traite les objets Personnes na pas besoin de distinguer les objets Etudiant de ceux d'Enseignant public class Afficheur { Personne[] personnes; . public void afficherToutePersonne() { for(int i=0; i<personnes.length; i++) { personnes[i].afficher(); // affichage d'un Etudiant // et celui d'un Enseignant peuvent tre diffrents. } } }
61
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Interface: type abstrait


Une interface est un type abstrait, cens tre implment par des classes. Il ne contient que les mthodes sans corps. Ces mthodes sont redfinir dans les classes d'implmentation On ne peut pas crer une instance d'une interface mais on peut crer une instance d'une classe d'implmentation.
AdaptateurWifiImpl1 envoyerDonner(..) { .. } recevoirDonner(..) { .. } AdaptateurWifiImpl2 envoyerDonner() {.. } recevoirDonner(...) { .. }

<<Interface>>

AdaptateurWifi
envoyerDonner(..) recevoirDonner(..)

62
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Interface: hritage multiple


Une classe peut hriter de plusieurs interfaces.
Chaque interface reprsente un rle d'une classe. Ex. un Lecteur CD-DVD a comme rles LecteurCD et LecteurDVD
<<Interface>> <<Interface>>

LecteurCD lirePiste()

LecteurDVD selectionnerLanguage();

LecteurCdDvdImpl lirePiste(); selectionnerLanguage(...); .

63
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Interface: syntaxe
interface nom_de_l'interface [ extends noms d'autres interfaces ] { public void methode1(String param1) ; public int methode2(int param1, int param2) ; // autres mthodes }

Le mot cl "extends" permet une interface d'hriter d'autres interfaces (une ou plusieurs)
64
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Implmentation d'une interface


Une classe implmentant une interface doit redfinir toutes les mthodes dclares dans l'interface.
public class LecteurCdDvdImpl implements LecteurCD, LecteurDVD { public void lirePiste(int noPiste) { . // faire } public void selectionnerLangue(String lang) { . // faire } }
65
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Les classes abstraites


Une classe abstraite est incomplte
Elle ne peut tre utilis telle quelle. Elle est cense tre spcifie par des sous classes. On ne peut pas crer une instance d'une classe abstraite.

Une classe abstraite peut avoir des mthodes vides ( redfinir par des sous-classes).

66
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple d'une classe abstraite


public abstract Feneitre { // attributs gnriques pour tout type de fentres. int posX; int posX; int dimX; int dimY; // Les mthodes dont l'implmentation est gnrique // (pour tout type de fentres). public void deplacer() { } public void redimensionner(int newDimX, int newDimY) { dimX = newDimX; dimY = newDimY; rafraichirContenu(); } // la mthode dont on ne connat pas encore l'implmentation // (cela dpend de type de fentre). Ainsi on la laisse vide. public abstract rafraichirContenu(); }
67
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Visibilit: modificateur public/private


Le modificateur public marque que les attributs/ mthodes d'une classe sont accessibles partout (dans les classes). Le modificateur private marque que les attributs/ mthodes d'une classe ne sont accessibles que dans cette classe.
class C2 { void m3() { C1 c1 = new C1(); c1.a1 = "hello"; // OK // c1.a2 = "hello"; illgal c1.m1(); // OK // c1.m2(); illgal } }
68
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

class C1 { public String a1; private String a2; public void m1(); private void m2(); }

Visibilit : autre modificateurs de visibilit


Les autres modificateurs sont:
aucun modificateur (par dfaut): les attributs/ mthodes sont accessibles
par les classes du mme package

protected: les attributs/ mthodes sont accessibles


par les classes du mme package, et par les sous-classes de la classe courante.

package p1; public class A { int a1; protected int a2; } public class B { // a1, a2 accessible }

package p2; public class C { // a1, a2 non accessible } public class D extends A { // a1 non accessible // a2 accessible }
69

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Encapsulation : principe
// pas d'encapsulation public class Date { public int jour; public int mois; public int annee; } // modification illgale Date d1 = new Date(); d1.jour = 30; d1.mois = 2; d1.annee = 2006;

Principle d'encapsulation :
Une classe devrait cacher des attributs et exposer ses mthodes au monde extrieur (aux autre classes)
Protger le contenu (les attributs) de la modification illgale Masquer les dtails internes de la classe simplification
70
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Encapsulation: Protection du contenu


public class Date { private int jour; private int mois; private int annee; public Date() { // initialis la date aujourd'hui } public boolean setDate(int j, int m, int a) { if( estDateValide(j, m, a) ) { jour =j; moi=m; annee=a; return true; } else { return false; } } }

Seule la modification valide est permise

71
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Encapsulation: Masque de dtails internes


public class Image { // squence d'octets au format propritaire private byte[] donnees; public void chargerDeFichier(File ficher) { // charger et convertir au format propritaire } public void afficher() { . // interprter le format propritaire. } }

L'utilisateur na pas besoin de connatre le format de donnes pour utiliser cette classe
72
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Membres statiques
Le modificateur static peut s'appliquer une mthode ou un attribut dune classe.
L'lment statique est partag par toutes les instances de la classe. Il est possible dy accder sans disposer dune instance, mais directement par la classe.

Ex : une mthode statique


public class Calculatrice { public static int valeurAbsolue( int i ) { if(i < 0) return -1 * i; return i; } }

// OK System.out.println( Calculatrice.valeurAbsolue(-25) ); // pas besoin de faire cela: Calculatrice c = new Calculatrice(); System.out.println( c.valeurAbsolue(-25) );
73

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Membres statiques: Exemple


public class Test { static int comptoir = 0; // initialiser lors du chargement de la classe int id; public Test() { id = comptoir; // utiliser le comptoir comme identifiant d'objet comptoir ++; //incrmenter le comptoir chaque instanciation } public imprimerId() { System.out.println(id); } public static imprimerComptoir() { System.out.println(comptoir); } } public static void main(String[] args) { Test t1 = Test(); Test t2 = Test(); Test t3 = Test(); Test.imprimerComptoir(); // rsultat? t1.imprimerId(); // rsultat ? t2.imprimerId(); // rsultat ? t3.imprimerId(); // rsultat ? }

Les mthodes statiques ne peuvent accder quaux attributs statiques.

74
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Dfinition de constants
Un constant peut tre dfini comme un attribut dune classe, avec dclaration <<static>> (partage par toutes les instances) et <<final>> (sa valeur est non modifiable) Par convention le nom d'un constant est tout en majuscules.
public class MesConstants { public static final int LOAD = 0; public static final int SAVE = 0; public static final int MOVE = 2; }
75
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exception
Une exception reprsente un problme produit lors de l'excution. Ex.
NumberFormatException
Integer.parseInt("vingt trois"); // un problme

Une application robuste doit pouvoir grer des exceptions. Scnario d'utilisation
1) Une exception cre et jete (par un module d'appli. Ex, classe C1) 2) Une exception est saisie et traite (par un autre module appli. Ex, classe C2)

76
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple d'une exception


public class FileLoader { public static byte[] load(String fileName) throws FileNotFoundException { if() { // si le fichier inexistant throw new FileNotFoundException(fileName); } // chargement normal } } public class MonAppli { public static void main(String[] args) { String fileName = ; try { // tentative d'une opration susceptible de gnrer une exception byte[] contenu = FileLoader.load(fileName); print(contenu); } catch(FileNotFoundException e) { // traitement d'une exception System.out.println(e); } } }
77
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Dfinition des types d'exceptions


On peut dfinir diffrents types d'exception.
Ex: appli scurise:
AuthentificationFailedException, InvalidUserNameException, InvalidePasswordException.

Un type d'exception : une classe hritant de java.lang.Exception. On peut dfinir des attributs pour reprsenter l'info spcifique un type d'exception
public class AutentificationFailedException extends Exception { // information sur la date de la tentative de l'authentification et le nom de utilisateur java.util.Date date = new Date(); String userName; public AutentificationFailed(String userName) { this.userName = userName } } public class InvalidUserNameException extends AuthentificationFailedException { public InvalidUserNameException(String userName) { super(userName) } }

78
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

La dclaration <<throws>>
La dclaration <<throws>> marque quune mthode est susceptible dmettre une exception. La mthode peut produire une exception elle-mme (avec oprateur <<throw>>) ou faire passer une exception produite par une autre mthode
public class LoginManager { public void login(String userName, String password) throws AuthentificationFailedException, ConnectException { . throw new InvalidUserNameException(userName); } } public class TransactionManager { public void doTransaction() throws AuthentificationFailedException, ConnectException { loginManager.longin(userName, password); . } }

gnratrice de l'exception

Appelle

faire passer l'exception


79

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Trace d'une exception


La trace d'une exception informe sur l'origine de l'exception
Facilit de dbuggage Chane d'appels : MonAppli.main() TransactionManager.doTransaction() LoginManager.login throw new InvalidUserNameException()

Elle est une chane d'appels de mthodes


de la mthode gnratrice de l'exception jusqu' la mthode main

Elle est stocke dans l'exception. Affichage de la trace :


catch(Exception e) { e.printStackTrace(); }

Affichage : InvalideUserNameException : jlopez at LoginManager.login (line 124) at TransactionManager.doTransaction (line 250) at MonAppli.main (linge 78)

80
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Le traitement d'exception
try { } catch(ExceptionType1 e) { } catch(ExceptionType2 e) { }

81
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.1 : Hritage et redfinition de mthode


Implmenter une application avec des classes Personne, Etudiant, Enseignant et Afficheur.
Les classes Etudiant et Enseignant redfinissent la mthode <<afficher()>> de la classe Personne.

Un affichage d'un Etudiant et celui d'un Enseignant prennent les formes:


Etudiant : [nom] no : [noEtudiant] promo : [promo] Enseignant : [grade] [nom]

Question
Si on nutilisait pas le concept de la redfinition:
Comment pourrait-on raliser cette application (avec <<instanceof>>) ? Si on ajoute dans le futur d'autres sous-classes de Personne, y aurait-il un modificafication ?

82
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.2 (1/5) : Manipulation des liens entre des objets


Notre application gre le systme de ficher. Elle se base sur:
Classe Rpertoire
Un rpertoire a un nom. Un rpertoire peut contenir des lments qui sont soit des fichiers, soit des rpertoires

Classe Fichier
Un fichier a un nom et son contenu.

Attribut reprsentant le contenu d'un rpertoire

On constate que le fichier et le rpertoire ont des caractres communs


Les deux portent un nom. Les 2 peut tre contenus par un rpertoire. Ainsi on cre la classe Element reprsentant ces caractres communs

Element

Attribut reprsentant le rpertoire conteneur

A faire: Dfinir en Java les classes Ficher, Rpertoire et Element

Fichier

Repertoire

83
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.2 (2/5)
Dfinir les mthodes permettant de:
Modifier le nom d'un fichier / rpertoire Modifier le contenu d'un fichier Dplacer un fichier / rpertoire

Dans la classe Rpertoire, crire une mthode permettant d'afficher le contenu du rpertoire rcursivement. Ecrire une classe main pour tester cette appli.
Crer une arborescence de fichier Afficher cette arborescence La modifier. Afficher le rsultat

84
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.2 (3/5) : Scnario de test


move Projet Doc Affichage du rpertoire (tat initial) : DocInterne [R] Projet [R] Projet/Doc [F] Projet/Doc/Doc1.doc : "contenu du Doc1.doc" [F] Projet/Doc/Doc2.doc : "contenu du Doc2.doc" [F] Projet/Doc/Doc3.doc : "contenu du Doc3.doc" [R] Projet/Doc/DocInterne [R] Projet/src [F] Projet/src/Class1.java: "class Class1 {}" [R] Projet/bin [F] Projet/bin/Class1.class: "010000111" [R] = Rpertoire [F] = fichier
erreur attendue (boucle)

rename Projet/Doc/Doc1.doc move Projet/Doc Projet/src

erreur attendue (conflit de noms)

move Projet/src/Doc/Doc2.doc rename Projet/src/Doc/Doc1.doc move Projet/src/Doc/Doc2.doc


erreur attendue (conflit de noms)

Projet/src Doc2.doc src src

moveReplace Projet/src/Doc/Doc2.doc
crasement attendu

85
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.2 (4/4) IHM


Crer la class IHM permettant l'utilisateur d'interagir avec le systme via les mthodes suivantes
void move(String cheminSource, String cheminDestination, boolean canReplace); void rename(String chemin, String nouveauNom);

86
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.2 (5/5) : Manipulation d'exception


Ajouter la manipulation des exceptions dans le systme de fichiers (TP prcdent). Dfinir les types d'exceptions suivantes :
InvalidName : l'utilisateur tente de nommer un fichier/ rpertoire avec des caractres non valides ( / \ : < > ? * |) ou la longueur du nom excde 20 caractres. NameConflict : l'utilisateur tente de nommer un fichier avec un nom dj pris par un des lments dans le mme rpertoire OwnershipViolation : l'utilisateur tente de dplacer un rpertoire dans un rpertoire successeur.

L'information que doivent porter les exceptions :


InvalideName, NameConflict : le nom causant le problme OwnershipViolation : la tentative de dplacement (le rpertoire dplacer et le rpertoire destinataire)

Faire un scnario de test pour chaque cas d'exception

87
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.3 (1/4) : Ralisation des interfaces du mcanisme d'vnements


Le mcanisme d'change d'vnements est trs utilis dans les applications d'aujourd'hui. Ce mcanisme se base sur 3 rles:
Linterface Sujet dfinit le rle des objets qui peuvent mettre des vnements. Linterface Observateur dfinit le rle des objets dsirant recevoir des vnements Linterface Evenement dfinit les objets contenant chacun une information quelconque (selon le type d'vnement) Le sujet offre une mthode pour inscrire des observateurs. L'observateur offre une mthode pour tre notifie lorsquun vnement est mis.

A faire: dfinir les interfaces Sujet, Observateur, Evenement

88
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.3 (2/4) : Implmentation gnrique

On souhaite implmenter cette application de manire gnrique avec la classe abstraite SujetAbstrait.
Elle implmente le mcanisme pour maintenir la liste des Observateurs inscrits ce sujet Elle offre la mthode (non abstraite) : void diffuserEvenement(Evenement ev);
Cette mthode sera utilise par les classes spcialistes pour diffuser des vnements quelconques.

89
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.3 (3/4) : Application sur le ebusiness


Notre application est compose de
Les classes FournisseurA, FournisseurB, FournisseurC reprsentent diffrents fournisseurs de produits dans le march. Elles prennent le rle de Sujet. Elles mettent des vnements sur des offres de produits. Chaque fournisseur offre un diffrent produit. Les classes MagasinA et MagasinB ont le rle d'Observateur. Elles souhaitent recevoir des offres de produits. Lorsquelles reoivent des offres, elles affichent
[MagasinB/ MagasinB] recu l'offre [nomProduit, prix, tempsLivraison] [accepte/ rejete] MagasinA accepte les produits moins chers que 100 euros. MagasinB accepte les produits livrables dans 7 jours maxi.

La classe OffreProduit a le rle d'vnement. Elle contient l'information sur le nom du produit, le prix, le temps de livraison.

A faire: Implmenter ces classes.


Utiliser la classe SujetAbstrat

90
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 4.3 (3/4) : Test


Dfinir un scnario de diffusion d'offres
Dans les classes FournisseurA, B, C dfinir la mthode : public void diffuserToutesOffres() { // ici on diffuse toutes les offres en rptant l'appel la mthode // diffuserEvenement() hrit de la classe SujetAbstrait }

Faire la classe main qui configure l'inscription des magasins auprs des fournisseurs et excuter le scnario

91
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

5. Tableaux, collections et Map

92

Tableaux
Un tableau est une squence d'lments
Squence de donnes primitives
Ex. int[], char[], byte[]

Squence de rfrences vers objets


Ex. Object[], Personne[]

On cre un tableau l'avec l'oprateur <<new>>


Ex.
int[] tab1 = new int[10]; int dim = 20; Object[] tab2 = new Object[dim];

Pour un tableau dobjets, initialement ses lments sont <<null>>

Un tableau est lui-mme un objet On accde aux lments du tableau avec un index (entre 0 jusqu' la dimension -1) On peut connatre la dimension du tableau par son attribut <<lenght>>

93
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Un tableau est un objet


On peut affecter un tableau au variable de type java.lang.Object
Object o = new Personne[20];

On peut dcouvrir le type du tableau


System.out.println(o instanceof Personne[]); // rsultat : true System.out.println(o.getClass().isArray()); // rsultat : true System.out.prinln(o. getClass().getComponentType().getName()); // rsultat : Personne

94
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Tableaux : redimension
La dimension du tableau est fixe lors de la cration de l'objet (new) Pour redimensionner, il faut :
1) Crer un nouveau tableau d'une nouvelle dimension 2) Copier les lments de l'ancien tableau vers le nouveau
Astuce: System.arraycopy( source, position, destination, position, nombreElements );

Ex. public static Object[] redimentionner(Object[] tab, int nouvelleDim) { Object nouveauTab = new Object[nouvelleDim]; int dimMin = (nouvelleDim> tab.length)? tab.length : nouvelleDim; System.arrayCopy(tab, 0, nouveauTab, 0, dimMin); }

95
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Un tableau de tableaux
Quel est le tableau rsultat de ce programme?
int[ ][ ] tab2dim = new int[5][ ]; // cration de tableau dimension 5 pour stocker des tableaux de <<int>> for(int i=0; i<tab2dim.length; i++) { tab2dim[i] = new int[i+1]; // creation d'un tableau de int for(int j=0; j< tab2dim[i].length; j++) { tab2dim[i][j] = j; } }

1 1 1 1 1 2 2 2 2 3 3 3 4 4 5
96

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Collections
Une collection manipule un ensemble d'objets Elle possde des mthodes pour :
Ajouter/supprimer un objet dans la collection Obtenir les objets dans la collection

Plusieurs variations
Une collection ordonne une liste Une collection filtrant la duplication des membres un ensemble
Un ensemble ne peut pas contenir le mme objet plus dune fois.
97
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Les collections prtes utiliser en Java


Le package java.util offre des implmentations des collections prtes utiliser Linterface Collection dfinit les mthodes, par ex :
boolean add(Object o) : ajouter un objet dans la collection int size() : consulter la taille de la collection iterator() : itrer dans tous les membres de la collection. Pendant l'itration, la collection ne doit pas tre modifie (pas ajout/suppression de membres) boolean contains(Object o) : tester si l'objet existe dans la collection. La comparaison d'objets se fait par la mthode equals().

Linterface List : des collections ordonnes (listes). Elle dfinit des mthodes spcifiques aux listes, par ex :
void add(int index, Object element) : ajouter un objet dans l'index specifi. public Object remove(int index) : retirer l'objet l'index spcifi

Les classes Vector, ArrayList sont des implmentations de List. La classe HashSet est une implmentation de Collection. Elle filtre la duplication de membres.
Il n'existe pas deux objets o1 et o2 tels que <<o1.equals(o2)>> dans l'ensemble.

98
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Collection de donnes primitives


On a vu que les membres de collections sont des objets et non des donnes primitives (int, char, double) Afin de mettre des donnes primitives dans une collection, on utilise la forme d'objets
int class java.lang.Integer char class java.lang.Character double class java.lang.Double

Ex.

Collection c = new Vector(); c.add(new Integer(3)); c.add(new Integer(2)); System.out.println( c.contains(new Integer(3)); // true

99
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Copier une collection


En gnral, les constructeurs des classes d'implmentation de collections (Vector, ArrayList, HashSet) prennent comme paramtre une collection source pour crer une copie.
Ex. List v = new Vector(); v.add("a"); v.add("ab"); List copie = new Vector(v); copie.add("abc"); System.out.println(v); // rsultat : [ a, ab ] System.out.pintln(copie); // rsultat : [ a, ab, abc ]

Il est possible d'utiliser un tel constructeur pour convertir entre plusieurs variations de collections
un ensemble vers une liste : dans un ordre quelconque une liste vers un ensemble : la duplication est ignore

100
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Conversion entre tableaux et collections


Tableau vers collection
utiliser la classe java.util.Arrays mthode : public static List asList(Object[] tab) Attention <<Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.)>> Afin d'obtenir une collection indpendante du tableau, crer une copie de la liste retourne par Arrays.asList() Ex.: Object[] tab = ; List l = new Vector(Arrays.asList(tab));

Collection vers tableau


Collection c = ; Object[] tab = c.toArray(); String[] tab2 = (String[]) c.toArray(new String[c.length])); // obtenir un tableau d'un type spcifique

101
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Trier une liste


La classe java.util.Collections propose les mthodes pour trier une collection.
static void sort(List list) : tirer une liste d'objet implmentant l'interface <<Comparable>> static void sort(List list, Comparator c) : trier une liste d'objet en utilisant un comparateur personnalis

interface Comparable :
propose la mthode : int compareTo(Object o); // retourne un nombre ngatif, 0, nombre positif si infrieur de, gal , suprieur Les objets basiques (Integer, String, Byte, Char, ) implmentent Comparable

interface Comparator :
propose la mthode : int compare(Object o1, Object o2)

102
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Paramtrage de la collection (Java 1.5)


Java 1.5 permet au programmer de spcifier le type d'objets qui sont membres de la collection. Avantages
Code plus lisible. Plus besoin de faire casting
Ex. for(Iterator it =

Dtection d'erreurs lors de la complication (Ex. ajout d'objets de mauvais type dans la collection) // Java 1.5 List<String> v = new Vector<String>(); v.add("a"); v.add("b"); v.add(new Integer(3); // erreurs de compliation for(int i=0; i<v.size(); i++) { String s = v.get(i); v.set(i, "prefix_" + s ); } // Java 1.4 List v = new Vector(); v.add("a"); v.add("b"); v.add(new Integer(3); // pas d'erreurs de compliation for(int i=0; i<v.size(); i++) { String s = (String) v.get(i); // produire erreur d'excution (ClassCastException Integer to String) v.set(i, "prefix_" + s ); }
103
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Map
Un map (objet implmentant l'interface java.util.Map) reprsente un ensemble de couples <cl, valeur>. Les cls et valeurs peuvent tre des objets de type quelconque. Il propose les mthodes :
void put(Object key, Object value) : ajouter un couple <cl, valeur> dans le Map. Sil existe dj un couple avec cette cl, le nouveau remplace l'ancien. Object get(Object key) : trouver la valeur associe une cl. Object remove(Object key) : retirer le couple <cl, valeur> s'il existe. retourner la valeur retire. Set keySet() : obtenir toutes les cls existant dans le map.

Classes java.util.Hashtable, java.util.HashMap : implmentations de l'interface Map Classe java.util.Properties : une implmentation de Map dont les cls et les valeurs sont des String.

104
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Table de hachage (Hashtable)


La table de hachage est une technique d'implmentation de Map Un tableau de grande taille est utilis pour stocker les couples <cl, valeur> Le hachage de la cl permet de trouver l'index du tableau pour stocker le couple/ rechercher le couple.
stocker les couples dont leurs cls entre 0 99 cls entre 100 - 199 Hachage : cls entre 200 - 199 l'index de 5 0 l'index de 105 1 l'index de 145 1 l'index de 213 2
105
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Les objets cls doivent redfinir la mthodes equals(..) et hashCode()


boolean equals(Object uneAutreCle)
Permet de tester si cette cl est gale une autre cl.

int hashCode()
Permet de trouver l'index du tableau associ cette cl. Contrat respecter : si deux cls sont gales, elles doivent retourner le mme index de hachage.

Les classes standards (String, Integer, Double ) proposent dj l'implmentation de ces mthodes.

106
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple d'utilisation incorrecte de Hashtable


Problme de programmation
int[] key1 = { 1, 2, 3 }; int[] key2 = { 1, 2, 3 }; Map m = new Hashtable(); m.put(key1, "valeur de 123"); System.out.println( m.get(key1) ); //afficher <<valeur de 123>> System.out.println( m.get(key2) ); //afficher <<null>> m.put(key2, "nouvelle valeur de 123"); System.out.println( m.get(key1) ); //afficher <<valeur de 123>> System.out.println( m.get(key2) ); //afficher <<nouvelle valeur de 123>> System.out.println( key1.hashCode() == key2.hashCode()); // afficher <<false>> System.out.println( key1.equals(key2.hashCode()); // afficher <<false>>

Les objets tableau ne proposent pas de bonne implmentation de equals() et hashCode()


Ainsi key1 et key2 sont considres comme ingales les couples <key1, > et <key2, > sont stocks dans deux index diffrents

107
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Redfinition de la mthode equals() et hashCode()


public class IntArray { // une classe enveloppant un tableau pour redfinir les mthodes equals(..) et hashCode() private int[] tab; public IntArray(int[] tab) { this.tab = tab; } public boolean equals(Object o) { if(this==o) return true; if(! (o instanceof IntArray) ) return false; IntArray ia = (IntArray) o; if(tab[].length != ia.tab[].length) return false; for(int i=0; i<tab.length; i++) { if(tab[i] != ia.tab[i]) return false; } return true; } public int hashCode() { // Deux objets IntArray gaux retournent le mme index. int somme = 0; for(int i=0; i<tab.length; i++) { somme=+tab[i]; } return somme; } }
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

108

Correction du problme
int[] key1 = { 1, 2, 3 }; IntArray key1 = new IntArray(tab1); int[] key2 = { 1, 2, 3 }; InArray key2 = new IntArray(tab2); Map m = new Hashtable(); m.put(key1, "valeur de 123"); System.out.println( m.get(key1) ); //afficher <<valeur de 123>> System.out.println( m.get(key2) ); //afficher <<valeur de 123>> m.put(key2, "nouvelle valeur de 123"); System.out.println( m.get(key1) ); //afficher <<nouvelle valeur de 123>> System.out.println( m.get(key2) ); //afficher <<nouvelle valeur de 123>> System.out.println( key1.hashCode() == key2.hashCode()); // afficher <<true>> System.out.println( key1.equals(key2.hashCode()); // afficher <<true>>

109
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 5.1 : Manipulation de tableaux


Implmenter un programme cherchant un Objet dans un tableau
mthode : int chercher(Object s, Object[] tab) retourner l'index si trouv (sinon retourner -1)

Tester ce programme avec cette mthode main :


public static void main(String args) { Object[] tab = { "a", null, "ab", null, '"abc", "abcd" }; // initialisation d'un tableau System.out.println( chercher("ab", tab) ); System.out.println( chercher("xyz", tab) ); }
110
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 5.2 (1/1) : Manipulation de listes


Ecrire un programme permettant d'inverser l'ordre des membres d'une liste, sans modifier la liste originale
public List inverser(List org)

Ecrire un programme permettant d'inverser une liste en modifiant la liste originale


public void inverserModif(List org)

Ecrire un programme permettant de filtrer des membres de collections (de type Integer) qui sont infrieur 0.
public Collection filtrer(Collection intCollection)

111
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 5.2 (1/2) : Manipulation de listes


On propose l'interface Filtre permettant de dfinir un filtre personnalis :
public interface Filtre { public boolean estFiltre(Object o); // vrai si l'objet est filtrer }

Ecrire un programme permettant de filtrer une collection avec un filtre personnalis


public void Collection filtre(Collection c, Filtre f)

Ecrire une classe d'implmentation de filtre (classe FiltreIntPair) pour filtrer des objets de type Integer
Les nombres impairs sont filtrs

Ecrire un programme prenant en arguments de ligne de commande une liste filtrer


Ex. java poo.tp5_3.MainClass 2 4 6 13 15 17 20 Astuce: en Eclipse, on spcifie les arguments de ligne de commande avec le menu Run Run l'onglet Arguments

112
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 5.3 : Map multivalu


Crer un map permettant dassocier une cl plusieurs valeurs. Le principe consiste utiliser le map <<normal>> associant une cl une liste de valeurs. Implmenter la classe MultivalueMap
public class MultivalueMap { Map<Object, List> map = new Hashtable<Object, List>(); // un map normal public void put(Object key, Object value) { } public List get(Object key) { } public List remove(Object key) { } // supprimer toutes les valeurs associes la cl et retourner les valeurs supprimes. public boolean remove(Object key, Object value) { } // supprimer une seul valeur retourner vrai si la valeur a exist (et donc a t supprime) }

Est-ce que la modification de la liste retourne par la mthode get() affecte les donnes stockes dans le map? Proposer l'implmentation de get(..) qui empche cela. Appliquer ce map pour stocker l'info sur les tudiants et leurs cours. Ex :
put ("000123", "Systmes I" ) : tudiant no 000123 prend le cours "Systmes I" put ("000123", "OOP") : cet tudiant prend galement le cours OOP put ("000124", "Anglais I" )

Ajouter la mthode affichant tous les couples du map sous forme d'une table.
L'affichage doit respecter l'ordre descendant des numros d'tudiants.

113
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 5.4 (1/2) : Map de donnes les plus rcemment utilises


Crer la classe <<CacheMap>> proposant les comportements suivants:
Elle a une capacit de stockage limite ( configurer lors de l'instanciation de la classe). Elle ne peut stocker que N couples. Lors qu'elle atteint sa capacit et que le programmeur tente dajouter un nouveau couple, elle supprime le couple le moins rcemment utilise (LRU: Least Recently Used). Pour identifier le couple LRU, elle maintient le classement de ces cls selon lordre daccs (via put/get)

CacheMap hrite de la classe Hashtable et redfinit certaines de ses mthodes.

114
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 5.4 (2/2) : Scnario de teste


public static void main(String[] args) { CacheMap m = new CacheMap(1000) ; // capacit 1000 for(int i=0; i<10000; i++) { m.put(new Integer(i), new Integer(i * 2)); m.get(34); } System.out.println("la Map est de taille : " + m.size() ) ; // attendu : 1000 System.out.println("la valeur de 9956 est : " + m.get(new Integer(9956)); // attendu : 2 fois 9956 System.out.println("la valeur de 35 est : " + m.get(new Integer(35)); // attendu : null System.out.println("la valeur de 34 est : " + m.get(new Integer(34)); // attendu : 2 fois 34. }
115
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

6. Manipulation des Entres/ sorties


flux et fichiers

116

Les entres-sorties
Le package java.io permet de grer la manipulation dentres / sorties. Les entres et les sorties sont des flux de donnes
flux entrants : le programme peut lire les donnes. flux sortants : le programme peut y mettre des donnes.

Source de donnes
Un flux connecte un programme avec une sources de donnes Ex. cran/clavier, fichiers, connexion TCP/TP, Web

Web Programme

fichier
117

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Flux abstraits
Abstraction
Permet au programme de lire/crire des donnes de diffrentes sources de donnes de la mme manire. Ex. On peut utiliser le mme code pour lire des fichiers et des pages web.

Classe abstraites
java.io.InputStream/ java.io.OutputStream : flux entrant/ sortant pour donnes brutes (octets) java.io.Reader/ java.io.Writer : flux entrant/ sortant pour donnes textes uni codes (16 bits)

Exception
java.io.IOException : reprsente des problmes de la connexion de flux
Dpendant des sources d donnes : Fichiers, Web

118
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Flux d'octets
InputStream propose les mthodes:
int read() : lire un octet (retourn en int), -1 si le flux est termin. int read(byte buf[]) : lire une squence d'octets et la mettre dans buf, retourner un nombre d'octets lus (entre 0 et buf.length), -1 si le flux est termin. close() : fermer le flux, librer des ressources associes.

OutputStream propose les mthodes:


void write(int b) : crire un octet (reprsent avec int) dans le flux void write(byte buf[]) : crire une squence d'octets dans le flux. flush() : Si la mmoire tampon est utilise, envoyer toutes les donnes de la mmoire tampon vers la destination. close() : terminer l'criture sur la source de donnes.
119
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Flux de caractres
Reader propose les mthodes:
int read() : lire un caractre (retourn en int), -1 si le flux est termin. int read(char buf[]) : lire une squence de caractres et la mettre dans buf, Retourner un nombre de caractres lus (entre 0 et buf.length), -1 si le flux est termin. close() : comme InputStream

Writer propose les mthodes:


void write(int c) : crire un caractre (reprsent avec int) dans le flux void write(char buf[]) : crire une squence de caractres dans le flux. flush() : comme OutputStream close() : comme OutputStream

120
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Flux concrets
les classes abstraites InputStream/ OutputStream et Reader/ Writer sont spcialiser pour reprsenter des flux concrets Exemple de flux d'octets
FileInput(Output)Stream : lire/ crire des fichiers ByteArrayInput(Output)Stream : lire/ crire des octets dans un tableau via les mthodes de InputStream/ OutputStream ObjectInput(Output)Stream : lire et crire des objets dans un flux quelconque (fichiers, rseaux)

Exemples de flux de caractres


FileReader(Writer) : lire/ crire des fichiers textes StringReader(Writer) : lire/ crire des caractres dans un String via les mthodes de Read/ Writer.

121
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple : lecture/criture de fichers


import java.io.*; public class Copy { public static void main(String[] args) throws IOException { FileReader in = new FileReader("c:/source.txt"); FileWriter out = new FileWriter("c:/destination.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); // dverrouiller (lecture seule) le fichier out.close(); // crire les donnes de la mmoire tampon vers le fichier et le fermer } }
122
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Lecture bloquante / non bloquante


La lecture de donnes du flux peut engendrer un dlai
Ex. Congestion de rseaux.

Le programme peut effectuer la lecture de deux manires


Bloquante : le programme attend jusqu' ce que les donnes soient disponibles
InputStream.read(), Reader.read() : le programme ne sort de ces mthodes que quand un octet / caractre est prt retourner

Non bloquante : le programme obtient uniquement les donnes actuellement disponibles


InputStream.read(byte[] buf), Reader.read(char[] buf) : Si les donnes ne sont pas encore disponibles, alors la mthode retourne 0 comme le nombres d'octets/ caractres lus.

123
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Emballage (wrapping) de flux


Certains types de flux peuvent emballer un autre flux. Ex.
BufferedInput(Output)Stream, BufferedReader(Writer) propose la gestion de mmoire tampon. Augmenter la performance Le programme lire/ crire des donnes sur la mmoire tampon. Ces donnes sont transfres de /vers le flux emball.

Les classes de flux qui peuvent emballer proposent un constructeur prenant comme paramtre le flux emballer Ex.

InputStream input = ; // flux entrant emballer BufferedInputStream in = new BufferedInputStream(input); OutputStream output = ; // flux sortant emballer BufferedOutputStream in = new BufferedOutputStream(output);

124
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Flux de connexion de rseaux


Lecture d'une URL
java.net.URL url = new URL("http://www.yahoo.com"); InputStream in = url.openStream();

Flux TCP/TP
java.net.Socket socket = new Socket(" www.yahoo.com", 80); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream();

125
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Manipulation de flux de caractres entrants La classe java.io.BufferdReader propose une mthode pratique pour lire chaque ligne de texte d'un flux emball (InputStream).
Ex.
InputStream in = new FileInputStream("c:/note.txt") BufferedReader br = new BufferReader(in); String ligne = br.readLine();

Pour analyser la ligne lue, utiliser la classe java.util.StringTokenizer


Ex.
StringTokenizer st = new StringTokenizer(ligne); while(st.hasMoreToken()) { String t = st.nextToken(); System.out.println(t); }
126
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Manipulation de flux de caractres sortants


La classe java.io.PrintWriter propose des mthodes pratiques pour crire diffrents types d'information sous forme textuelle vers un flux emball (OutputStream).
Ex. print(int i), print(boolean b), print(String s), print(Object o) . println(int i), println(boolean b), println(String s), println(Object o).

Pour transformer un objet vers du texte [print(Object o)], la mthode toString() de l'objet est invoque. La classe de l'objet peut fournir l'implmentation de toString() pour proposer la reprsentation textuelle de l'objet. Ex.

Personne { String nom; public String toString() { return "Personne : " + nom; } }

OutputStream out = ; PrintWriter w = new PrintWriter(out); Personne[] tab = ; w.println("Les membres de l'quipe") for(int i=0; i<tab.length; i++) { w.println(tab[i]); }

127
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Les flux dentre et de sortie standard


Le flux dentre standard : System.in (instance de InputStream)
Par dfaut, la source de donne est le clavier

Flux standard de sortie (instance de PrintWriter):


System.out : le flux sortant qui, par dfaut, saffiche lcran System.err : le flux sortant pour les erreurs (qui, par dfaut, saffiche galement lcran )

128
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Connexion de deux modules de programme avec un tuyau (<<pipe>>)


Un programme peut tre divis en plusieurs modules. Chaque module effectue une tache parallle. Un tuyau permet la communication entre les modules.
un module permet d'envoyer des donnes un autre module par un flux.
Le module producteur : envoie des donnes par PipeWriter ou PipeInputStream Le module consommateur : renvoie les donnes par PipeReader ou PipeInputStream

Etablissement de connexion de modules


PipedWriter pipeOut = new PipedWriter(); PipedReader pipeIn = new PipedReader(pipeOut); // pipeOut est utlis par le producteur // pipeIn est utlis par le concomateur

Module producteur utilise PipeWriter ou PipeOutputStream

Module consommateur utilise PipeReader ou PipeInputStream


129

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Srialisation et reconstitution d'objets travers un flux


La classes ObjectInput(Output)Stream permettent de lire et crire des objets du programme Cas d'utilisation
Sauvegarder l'tat du programme dans un ficher pour pourvoir recharger plus tard Envoyer des objets d'un programme un autre programme.

Elle propose les mthodes


void writeObject(Object o) : crire un objet vers le flux. L'criture d'objet consiste crire l'tat de l'objet (tous les attributs) Object readObject() : reconstituer l'objet qui a t crit par writeObject().

Les classes des objets <<srialisable>> doivent implmenter l'interface java.io.Serializable.

130
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple de la srialisation d'objets


// chargement d'un objet d'un fichier FileInputStream fin = new FileInputStream("c:/biblio.obj"); ObjectInputSteam oin = new ObjectInputStream(in)); Biblioteque biblio = oin.readObject(); // on peut naviguer vers des livres et des adhrents et exemplaires public class Bibliotheque implements Serializable { List<Livre> livres; List<Adhrent> adherents; } public class Adhrent implements Serializable { String nom; } public class Exemplaire implements Serializable { int no; Adhrent emprunteur; // null signifie libre }

public class Livre implements Serializable { String nom; String auteur; List<Exemplaire> exemplaires; }

131
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple: Flux de donnes compresses


// From The Java Developers Almanac 1.4 // Files to include in the ZIP file String[] filenames = new String[]{"filename1", "filename2"}; // Create a buffer for reading the files byte[] buf = new byte[1024]; try { // Create the ZIP file ZipOutputStream out = new ZipOutputStream(new FileOutputStream("outfile.zip")); // Compress the files for (int i=0; i<filenames.length; i++) { FileInputStream in = new FileInputStream(filenames[i]); // Add ZIP entry to output stream. out.putNextEntry(new ZipEntry(filenames[i])); // Transfer bytes from the file to the ZIP file int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } // Complete the entry out.closeEntry(); in.close(); } // Complete the ZIP file out.close(); } catch (IOException e) { }
132
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Manipulation de fichiers et rpertoires


La classe java.io.File reprsente des fichiers et des rpertoires existants ou non (qui vont tre crs). Elle propose des mthodes suivantes pour manipuler les fichiers des rpertoires :
File(String pathname), File(String parent, String child) boolean exists() boolean canRead(), boolean canWrite() boolean delete(), boolean renameTo( File dest ) boolean isDirectory(), boolean isFile(), long length() boolean mkdir() File getParentFile(), File[] listFiles()

133
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 6.1 : Flux d'objets et srialisation


On souhaite crer une application permettant aux utilisateurs d'diter l'information dans une bibliothque. Elle accepte des commandes suivantes du clavier.
crer livre [nom] [auteur] [nombreExemplaire] crer adhrent [nom] emprunter [adhrent] [livre] retourner [adhrent] [livre] [noExemplaire] sauvegarder [nomFichier] : sauvegarder l'info sur un fichier. charger [nomFichier] : charger l'info depuis un ficher. arrter : arrter l'application

134
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 6.2 : Manipulation de fichiers et rpertoires


Crer une application qui ressemble une console. Elle propose les commandes suivantes pour manipuler les fichiers et rpertoires
pwd, cd [chemin complet ou relatif], cd .. dir mkdir [nom de rpertoire], rename [nom actuel] [nouveau nom] move [fichier/rpertoire] [chemin du rpertoire destinataire]. del [nom de ficher/rpertoire]. copy [fichier source] [fichier cible] view [fichier]
visualiser sur l'cran

135
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

7. Threads et synchronisation
La programmation concurrente, synchronisation, wait et notify. Problmes producteurconsommateur, lecteur-crivain
136

Thread
Un programme multithreads peut excuter plusieurs activits en parallle.
Ex. Application de tlchargement : plusieurs threads tlchargent des fichiers en parallle.

Un thread suit une squence d'instructions

137
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple : tlchargement parallle


Thread A : charger un fichier : "A.zip" while(p<100.00) { [charger un bloc de donnes] [afficher : fileName charg p% ] } [afficher : fileName chargement complet ] Thead B : charger un fichier : "B.zip" while(p<100.00) { [charger un bloc de donnes] [afficher : fileName charg p% ] } [afficher : fileName chargement complet ] Ecran : A.zip charg 3% B.zip charg 8% A.zip charg 5% B.zip charg 13% ..

138
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Dfinir ce que font des threads


Les classes hritant de java.lang.Thread ou implmentant l'interface java.lang.Runable spcifient le code que doivent excuter des threads.
redfinir la mthode run()

Un objet instance d'une telle classe reprsente un thread


public class MonThread extends Thread { String fileName; public void run() { // redfinition // le code } } instanciation
139
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Thread A : charger A.zip

Thread B : charger B.zip

Deux faons de dfinir un thread Faon 1 : Crer une classe hritant de la classe java.lang.Thread Faon 2 : Crer une classe implmentant l'interface java.lang.Runnable

140
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Lancement de threads
Instanciation d'une classe dfinissant le thread.
MonThread t = new MonThread("A.zip", "Thread A"); Le constructeur est utile pour passer des donnes qui seront manipules par le thread Ex. passer le nom du fichier charger.

Si la classe est dfinie de la faon 1 (Thread)


t.start();

Si la classe est dfinie de la facon 2 (Runable)


Crer un thread enveloppe et appeler start() Thread enveloppe= new Thread(t, "Thread A"); enveloppe.start();

La mthode run() que vous avez dfinie sera excute par le systme en activit parallle.
N'appelez pas vous mme la mthode run() ! : Cela ne crera pas le paralllisme.

141
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple : lancement de thread chargeur de fichiers


public class MonThread extends Thread { String fileName; public MonThread(String fileName, String threadName) { super(threadName); this.fileName = fileName; } public void run() { } public static void main(String[] args) { MonThread tA = new MonThread("A.zip", "Thread A"); MonThread tB = new MonThread("B.zip", "Thread B"); tA.start(); tB.start(); } }

142
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Dfinir une tache priodique


Exemple d'une tache priodique
Vrification de l'arrive de nouveaux mails

En gnral, une tache priodique pouse un comportement comme suit :


while(activated) { // faire quelque chose try { Thread.sleep(60000); // 60 secondes } catch(InterruptedException e) { } }

La mthode sleep(..) permet au thread courrant d'arrter l'excution pendant un temps spcifi (en milliseconde)

143
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Synchronisation : le problme
Quel problme peut se poser si plusieurs threads accdent aux mme donnes (objets) de manire concurrente?
write() Thread A read() Thread B public File { public byte read() { } public void write(byte[] b) { } } donne (fichier)

144
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Synchronisation : dfinition de section critique


La section critique est une section o un seul thread peut entrer chaque moment
Ex. Le corps des mthodes read(), write()

Deux approches pour dfinir la section critique


Faon 1 : Mettre le mot cl <<synchronized>> devant la mthode Faon 2 : Utiliser le block : synchronized(object) { . } // faon 1 public File { public synchronized byte read() { } public synchronized void write( byte[] b) { } } // faon 2 // A chaque fois de lire un fichier f synchronized(f) { f.read(); }

145
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Synchronisation : Exemple
Trois threads tentent excuter les sections critiques d'un mme objet en mme temps un seul thread peut y entrer chaque moment Thread 1 f.write(); entrer dans la mthode excuter la mthode finir la mthode objet : f Thread 2 Thread 3

f.read(); bloqu bloqu entrer dans la mthode excuter la mthode finir la mthode

f.write() bloqu bloqu bloqu bloqu entrer dans la mthode excuter mthode finir la mthode

temps
146
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Coordination entre threads : Exemple de producteur-consommateur


On prsente ici une appli multi-thread qui a besoin de la coordination Cette appli est compose de:
Des threads "producteur" qui produisent des donnes et les mettent dans une file de messages. Des threads "consommateur" qui prennent les donnes de la file.

Cette appli ncessite la coordination suivante :


Les producteurs et les consommateurs ne doivent pas accder la file en mme temps (section critique) Quand la file est pleine : Les producteurs doivent attendre jusqu' ce qu'une place dans la file est libre. Quand la file est vide : Les consommateurs doivent attendre jusqu' ce qu'une donne est produite dans la file.

Producteurs

File de messages

Consommateurs
147

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Moniteur d'accs
Un moniteur d'accs propose des mthodes pour accder la file de manire contrle. Ces mthodes peuvent bloquer tant que les donnes ne sont pas prtes pour y accder.
public class Moniteur { private List file = new Vector(); // file de messages. public synchronized void Moniteur(int capacity) { } // crer un moteur pour une file d'attente de capacit spcifie public synchronized void put(Object o) { } // dposer une donne. bloquer si la file est pleine. public synchronized Object take() { } // prendre une donne. bloquer si la file est vide } // producteur while() { moniteur.put(o); } // consommateur while() { System.out.println( moniteur.take() ); }
148
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Les mthodes wait(), notify(), notifyAll()


Le moniteur d'accs a une responsabilit de bloquer/ dbloquer les threads
Les producteurs
Quand le file est pleine : Bloquer Quand il existent des places libres : Bbloquer

Les consommateurs
Quand la file est vide : Bloquer Quand il existent des donnes dans la file : Dbloquer.

Le moniteur d'accs contrle le blocage/ dblocage grce aux mthodes :


void wait() throws InterruptedException : Suspendre (bloquer) le thread courrant
Lors que le thread est suspendu, il laisse les autres threads entrer dans la section critique

void notify() : Rveiller (dbloquer) un des threads qui ont t suspendus void notifyAll() : Rveiller tous les threads qui ont t suspendus

Ces mthodes sont proposes par tous les objets Java (java.lang.Object)

149
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Implmentation du Moniteur d'accs


public class MoniteurProdCons { private List file = new Vector(); private int cap; public MoniteurProdCons(int capacity) { this.cap = capacity; } public synchronized void put(Object o) { while(file.size()==cap) { // tant que la file est pleine try { wait(); } catch(InterruptedException e){ } } file.add(o); notifyAll(); // notifier les consommateurs de la production d'une donne } public synchronized Object take() { while(file.size()==0) { // tant que la file est vide try { wait(); } catch(InterruptedException e){ } } Object o = file.remove(0); notifyAll(); // notifier les producteurs de la libration d'une place dans la file return o; } }
150
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

MoniteurProdCons: Illustration
Cons1
print( m.take()); Entrer dans la section critique La file est vide, donc le thread est suspendu print( m.take() ); Entrer dans la section critique La file est vide, donc le thread est suspendu m.put(o1); Entrer dans la section critique La file devient { o1 }, Les threads suspendus sont notifis Finir la mthode Rveiller Rentrer dans la section critique L'objet o1 est retirer de la file et affich, la file devient vide Finir la mthode Rveiller Attendre de rentrer dans la section critique

Cons2

Prod1

Rentrer dans la section critique La file est encore vide, donc le thread est suspendu nouveau

temps

151

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple de lecteur-crivain
L'appli lecteur-crivain est un autre exemple de la coordination entre les threads. Elle est compose de
Un ensemble de threads qui peuvent lire et crire des donnes. Des lectures concurrentes sont permises Une criture est exclusive d'autres lectures et critures.

Lecteur 1 byte[1000] tableau

Ecrivain 1

Lecteur 2
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Ecrivain 2
152

Moniteur d'accs lecture-criture


public class MoniteurTableau { public synchronized void acquireReadLock() { } // demander le droit de lecture, bloquer si le tableau est en criture par un autre thread. public synchronized void acquireWriteLock() { } // demander le droit d'criture, bloquer si le tableau est en lecture/criture par d'autres threads public synchronized void releaseReadLock() { } // indiquer la fin de lecture public synchronized void releaseWriteLock() { } // indiquer la fin d'criture public byte read(int index) { } public void write(int index, byte b) { } } // lecteur Moniteur m = ; m.acquireReadLock(); for(int i=0, i<1000; i++ ) { byte b = m.read(i); } m.releaseReadLock(); // crivain Moniteur m = ; m.acquireWriteLock(); for(int i=0, i<1000; i++) { m.write(i, (byte)2); } m.releaseWriteLock();

153
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Implmentation du moniteur
public class MoniteurTableau { Set lecteurs = new HashSet(); // la liste des lecteurs en cours Thread ecrivain = null; // l'crivain en cours public synchronized void acquireReadLock() { // attendre jusqu' ce que le tableau ne soit pas en criture par un autre thread while(ecrivain !=null) { try { wait(); } catch(InterruptedException e){ } } lecteurs.add(Thread.currentThread()); // inscrire un nouveau lecteur dans la liste } public synchronized void acquireWriteLock() { // attendre jusqu' ce que le tableau ne soit ni en lecture ni en criture par les autres threads while(ecrivain!=null || ! lecteurs.isEmpty() ) { try { wait(); } catch(InterruptedException e){ } } ecrivain = Thread.currentThread(); // inscrire l'crivain en cours } public synchronized void releaseReadLock() { lecteurs.remove(Thread.currentThread() ); // enlever ce lecteur de la liste notifyAll(); // notifier les crivains en attente } public synchronized void releaseWriteLock() { ecrivain=null; // indiquer qu'il n'existe plus d'crivain en cours. notifyAll(); // notifier les lecteurs/ crivains en attente } // implmentation des mthodes read(), write() }
154
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Smaphore
Un smaphore est un moniteur d'accs qui maintient N jetons.
Un thread peut prendre un jeton du smaphore et puis le rendre au smaphore Lors que aucun jeton n'est libre, un thread demandeur de jeton sera bloqu jusqu' ce qu'un jeton soit libr.

La classe "smaphore" ressemble ceci:


public class Semaphore { public Semaphore(int n) { } // constructeur, crer un smaphore de 'n' jetons. public void acquire() { } // prendre un jeton, bloquer si aucun jeton n'est libre public void release() { } // rendre un jeton, et rveiller les threads en attente }

A vous d'essayer
Ecrire le code de la classe Semaphore

155
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Package java.util.concurrent (Java 1.5)


Java 1.5 propose maintenant les classes utilitaires pour manipuler la coordination entre les threads
java.util.concurrent.ArrayBlockingQueue : similaire au moniteur producteur-comsommateur prsent
Methodes : void put(Object o); Object take();

java.util.concurrent.locks.ReadWriteLock : similaire au moniteur lecture-criture prsent. java.util.concurrent.Semaphore

156
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 7.1 Producteur-consommateur
Illustrer la coordiation de thread dans une application de producteurconsommateur Crer une file de messages de capacit 5. Crer 2 producteurs (P1, P2) et 2 consommateurs (C1, C2)
P1 met un par un des objets Integer {1, 3, 5, 7, 9 } dans la file, et P2, {2, 4, 6, 8, 10}. A chaque production, le producteur affiche le message :
[P1/P2] met [objet]

C1 et C2 prennent chacun 5 objets de la file. A chaque consommation, le consommateur affiche le message :


[C1/C2] reu [objet]

NB. P1 et P2 devraient tre instances de la mme classe <<Producteur>>. Comment peut-t-on configurer ces composants pour qu'ils puissent mettre diffrents objets?

Expliquer le rsultat affich


157
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 7.2 : Lecteur crivain


Illustrer la coordination de thread dans une application de lecteur-crivain Complter la classe MoniteurTableau. Crer le scnario de test avec 2 lecteurs (L1, L2) et 2 crivains (E1, E2).
Afin de mieux illustrer le paralllisme, on retarde la dure de la lecture/ criture du tableau. C'est--dire que lon fait dormir le thread pour une dure d'une milliseconde chaque fois quun octet est lu ou crit. Plus prcisment, on ajoute l'instruction suivante entre la lecture/criture de chaque octet :
try { sleep(1); } catch(InterruptedException e) { }

L1 et L2 affichent le message <<[L1/L2] read lock acquired>> aprs l'appel acquireReadLock(), et affiche <<[L1/L2] releasing read lock>> avant l'appel releaseReadLock(). E2 et E2 affichent les messages similaires Expliquer le rsultat affich.

158
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 7.3 : Tlchargement de fichiers en parallle


Crer une application permettant de tlcharger des fichiers spcifis avec URLs en parallle
Utiliser la classe java.net.URL pour obtenir InputStream

Utiliser la mthode lecture bloquante - int read() [] - pour lire une donne octet par octet. Chaque block de 200 octets lus, afficher ce message :
[nom de thread] : 200 octets lus.

Crer un scnario de test avec 3 threads Question : Si on utilise un seul thread pour tlcharger 3 fichiers, l'application sera-t-elle plus ou moins rapide?
159
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

8. Manipulation des documents XML avec Java

160

XML (eXtensible Markup Language)


Recommandation W3C Un document XML reprsente des donnes structures sous forme d'un arbre.
Ex. reprsentation d'un livre avec XML

Interoprabilit
<?xml version="1.0" encoding="UTF-16"?> <book> <booktitle> Learning Java and XML </booktitle> <chapter> <number> 1 </number> <title> Introduction </title> <content> . </content> </chapter> <chapter> . </chapter> </book>
161
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Les technologies XML


Manipulation de base de documents XML : DOM, SAX Vrification du contenu de documents XML : DTD, Schma XML Transformation de documents XML vers d'autres documents: XSLT Liaisons entre documents XML : XLink, XPointer Requte sur documents XML : XQuery Echange et traitement de documents XML dans les systmes rparties : Web Services Applications spcifiques aux domaines : Quelques formats standards de documents XML
SMIL (Synchronized Multimedia Integration Language) MathML (Mathematical Markup Language) ICE (Information and Content Exchange)

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Plus d'info : http://www.w3c.org

162

Prolog XML
Le prolog prend la forme :
<?xml version="1.0" encoding="UTF-16"?>

Il se localise au dbut du document XML Le document doit tre encod correctement d'aprs la dclaration dans le prolog
Valeur par dfaut : UTF-8

Ex. : Ces deux documents doivent tre encods diffremment dans le flux d'octets !

<?xml version="1.0" encoding="UTF-16"?> <book> </book> <?xml version="1.0" encoding="UTF-8"?> <book> </book>
163
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Un document XML est un arbre des balises


Les balises sont nommes.
Ex. <book>, <title>, <number>

Les balises ouvrante et fermante


Ex. <book> some content</book> On peut y mettre des sous balises.

Si entre les deux balises est vide courte


Ex. <book></book> <book/>

on peut utiliser la forme

Les balises doivent tre bien formes (ouverture/ fermeture)


Ex. <book> <name> </book> </name> Mal form
164
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Choix entre sous balise et attributs


Utilisation de sous balises
<?xml version="1.0"?>

Utilisation des attributs


<?xml version="1.0"?>

<message> <to>you@yourAddress.com</to> <from>me@myAddress.com</from> <subject>XML Is Really Cool </subject> <text> How many ways is XML cool? Let me count the ways... </text> </message>

<message to="you@yourAddress.com" from="me@myAddress.com" subject="XML Is Really Cool"> <text> How many ways is XML cool? Let me count the ways... </text> </message>

165
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Des textes entre des balises


<?xml version="1.0" encoding="ISO8859-1" ?> <message> (retourne de ligne) (tab) <to>you@yourAddress.com</to> (retour de ligne) (tab) <from>me@myAddress.com</from> (retour de ligne) (tab) <subject>XML Is Really Cool</subject> (retour de ligne) (tab) <text> How many ways is XML cool? Let me count the ways... </text> (retour de ligne) </message>

Lors de la manipulation de documents XML, on vite de traiter des textes non significatifs (retour de lignes, tab etc) En terminologie XML, ces textes sont appels "PCDATA" (Parsed Character Data) Ils ne peuvent pas contenir ces caractres : < > ' "
A replacer :
< par &lt; > par &gt; & par &amp; ' par &apos; " par &quot;

166
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

D'autres caractres
Caractres non pars (CDATA)
On peut mettre n'importe quel caractre entre <![CDATA[ et ]]>
<script> <![CDATA[ function matchwo(a,b) { if (a < b && a < 0) then { return 1 } else { return 0 } } ]]> </script>

Des commentaires
<!-- This is a comment -->

167
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Espace de nom (<<namespace>>) XML


Comment distinguer deux balises portant le mme nom?
<name>John Smith</name> <name>Wall street</name> : person name : street name

Solution: utiliser le namespace


xmlns:ns1="http://mydefinition/person" .. <ns1:name>John Smith</ns1:name> xmlns:ns2="http://my-domain/map/street" .. <ns2:name>Wall street</ns2:name>

Un namespace est dfini par un URI


Ex. http://:mydefinition/person, http://my-domain/map/street

Un namespace est rfrenc par un alias


Ex. ns1, ns2
168
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple d'un document XML avec des namespaces


<f:table xmlns:f="http://www.w3schools.com/furniture"> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>

169
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Grammaire de documents XML


<book> <booktitle> Learning Web Services </booktitle> <birthday>12-01-1982</birthday> <chapter> <number> 1 </number> <title> What are Web Services? </title> <content> . </content> </chapter> </book>

Est-ce correct?

Besoin de dfinir quelles balises sont permises.

170
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Grammaire de documents XML : Deux approches


DTD
Simple Un DTD peut tre mis au dbut du document XML

Schma XML
Plus puissant, de plus en plus utilis. Un schma XML est lui-mme un document XML.

171
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Un exemple de DTD
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>

172
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Un exemple de Schma XML


<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified"> <xsd:element name="note" type="notetype"/> <xsd:complexType name="notetype"> <xsd:sequence> <xsd:element name="to" type="xsd:string"/> <xsd:element name="from" type="xsd:string"/> <xsd:element name="heading" type="xsd:string"/> <xsd:element name="body" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
173
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Manipulation de documents XML en Java


Manipulation de documents XML
Analyser le contenu des documents.
Vrification du contenu, extraction d'information

Construire un document

W3C propose deux APIs pour manipuler les documents Java


DOM (Document Object Model) SAX (Simple API for XML)

Ces APIs ont t portes sur la plateforme Java


Packages: org.xml.sax, org.w3c.dom

174
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

8.1. SAX (Simple API for XML)

175

SAX
Programmation dirige par vnements
Evnements :
start A start H start G end A

Document XML

Traitement Parseur
176
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple d'vnements gnrs

<?xml version="1.0"?> <book> <booktitle> Learning Java and XML </booktitle> <chapter> <number> 1 </number> <title> Introduction </title> <content> . </content> </chapter> <chapter> . </chapter> </book>

start book, start booktitle, start chapter, start number, end number, start title, end title, start content, end content, end chapter, . end book

177
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Le parseur : org.xml.sax.XMLReader
Mthodes pour configurer les traiteurs d'vnement.
void setContentHandler(ContentHandler handler)

Mthode pour commencer le parcours du document


void parse(org.xml.sax.InputSource input) throws IOException, SAXException
L'objet InputSource peut tre construit en enveloppant l'objet java.io.InputStream ou java.io.Reader.

178
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Interface org.xml.sax.ContentHandler
On implmente l'interface ContentHandler pour traitement des lments. Les mthodes suivantes seront appeles lors du parcours d'un document XML :
Dbut et fin du document
void startDocument() void endDocument()

Dbut et fin de chaque lement


void startElement(String namespaceURI, String localName, String fullName, Attributes atts) void endElement(String namespaceURI, String localName, String fullName)

Dtection du texte entre des balises


void characters(char[] ch, int start, int length)

179
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Interface org.xml.sax.ContentHandler (en plus de dtails)


startElement() et endElement() : Les significations de ses paramtres
String namespaceURI : URI de l'espace de nom (ex. http://www.w3schools.com/furniture) String localName : le nom de la balise sans l'espace de nom (ex. table, name, width, length) String fullName : le nom complet (ex. f:table, f:name, f:width, f:length) Attributes atts [pour startElement()] : une liste des attributs de cette lment. On peut consulter cette liste via l'API de org.xml.sax.Attributes

void characters(char[] ch, int start, int length)


Les caractres sont localiss dans le tableau <<ch>>. Ils commencent l'index <<start>> et ont pour longueur <<length>> Pour obtenir un String, on peut faire :
String s = new String(ch, start, length); // on obtient "African Coffee Table", "80", ou "20"

<f:table xmlns:f="http://www.w3schools.com/furniture"> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>


180
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Localisation des balises dans le document


Le parseur passe l'objet Locator au ContentHandler. Lors que le ContentHandler reoit un vnement, il demande la localisation de la balise concerne au Locator
1: setDocumentLocator(locator) Parseur 2: startElement() Locator ContentHandler

3: getLineNumber() getConsumeNumer()
181

Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Traitement d'erreurs
XMLReader gnre des erreurs lors du parcours du document
methode void parse(org.xml.sax.InputSource input) throws IOException, SAXException

Les erreurs peuvent tre :


Caractres non valides trouvs. Document XML mal form (manque de balises ouvrant / fermant) Problmes de E/S (IOException)

Si les erreurs sont dtectes, le parseur arrte le parcours du document et jette une exception. On peut afficher plus de dtails d'erreurs comme suit
} catch (SAXParseException spe) { System.out.println("\n** Parsing error" + ", line " + spe.getLineNumber() + ", uri " + spe.getSystemId()); System.out.println(" " + spe.getMessage() ); } catch (Exception e) { e.printStackTrace(); }

182
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Arrt du parcours
Arrter le parcours d'un document XML, c'est utile dans les cas suivants :
On trouve une erreur, donc inutile de parser plus loin On trouve une information qu'on recherche dans le document, puis on souhaite arrter le parcours.

Les mthodes de ContentHandler offrent le moyen de jeter des exceptions


startElement(..), endElement(..), characters(..) throws SAXException.

Lors que ContentHandler jette une exception, le parseur va arrter le parcours du document et ensuite jeter une exception par la mthode parse() parse(...) Appli Parseur vnement ContentHandler

SAXException
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

SAXException
183

Spcification de l'implmentation du parseur SAX


L'API SAX est un ensemble d'interfaces. Elle peut donc avoir diffrentes implmentations. La classe org.xml.sax.helpers.XMLReaderFactory permet dinstancier un objet XMLReader avec une classe dimplmentation particulaire
static XMLReader createXMLReader() : utiliser la proprit Systeme "org.xml.sax.driver" pour identifier l'implmentation. static XMLReader createXMLReader(String className) : crer une instance de la classe d'implmentation spcifie.

NB. Les proprits systme peuvent tre configures de 2 faons


Ligne de commande (lors de lancement de l'appli)
Ajouter D[proprit]=[valeur]

En excution
java.lang.System.setProperty("property1", "valeur1");

184
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Rcapitulatif : tape suivre


Crer une XMLReader
XMLReader r = XMLReaderFactory.createXMLReader();

Spcifier le ContentHandler
r.setContentHandler(monContentHandler());

Parser
r.parse(inputStream);
185
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 8.1 SAX
Yahoo! fournit un service de recherche web retournant le rsultat en format XML
Exemple d'une requte au Yahoo! Web Search
http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=Yaho oDemo&query=java+xml&results=100

Examiner le document XML retourn. Ecrire un programme permettant de filtrer les rsultats plus rcents d'une date spcifie (D'aprs la balise <ModificationDate>).
Afficher toute info sur les rsultats retenus. NB. La date de modification est reprsente par une long

Modifier le programme prcdent pour qu'il arrte le parcours du fichier une fois que 10 rsultats sont retenus.

186
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

8.2. DOM (Document Object Model)

187

DOM
L'API DOM permet de naviguer dans un arbre XML et le modifier
Navigation Modification Document XML Document XML Srialisation
188
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Construction d'un arbre Programme

Les nuds dans un arbre XML


Document : le nud racine.
Il contient un fils unique de type Element

Element : une balise XML


Il peut contenir des Elments fils, des Attributs et des Textes

Attr : des attributs dans les Elments Text, CDATASection, Comment : des nuds reprsentant PCDATA, CDATA, et des commentaires, localiss entre des balises
Les Texts peuvent tre des retours de ligne, des tabs.

Node : un nud gnrique


Document, Element, Attr, Text, CDATASection, et Comment hritent de Node.

189
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Construction d'un arbre


La class javax.xml.parsers.DocumentBuilder permet de construire un arbre.
Un arbre est accessible partir de l'objet org.w3c.dom.Document

Un DocumentBuilder peut-etre obtenu par le factory


DocumentBuilderFactory.newInstance().newDocumentBuil der()

Le DocumentBuilder propose les mthodes :


Document parse(InputStream in) : crer un arbre partir du flux XML Document newDocument() : crer un arbre vide

190
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Navigation
Document d = documentBuilder.parse(inputStream); // obtenir la balise racine. Element root = d.getDocumentElement(); // obtenir le nom de la balise root.getName() // obtenir des attributs dans une balise NamedNodeMap attMap = root.getAttributes(); for(int i=0; i<attMap.getLength(); i++) { Attr a = (Attr) attMap.item(i); System.out.println( a.getName() +" : " +a.getValue() ); } String value = root.getAttribute("att1") //Une autre faon // obtenir des fils (Element, Text, CDATASection ou Comment ) NodeList nodeList = root.getChildNodes(); for(int i=0; i< nodeList.getLength(); i++) { Node n = nodeList.item(i); if(n instanceof Element) { . } // sinon n peut tre instance de Text, CDATASection ou Comment }
191
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Navigation
On peut galement monter dans l'arbre
Element parent = (Element) elem.getParentNode();

On peut naviguer d'un lment vers le Document


Document doc = elem.getOwnerDocument();

On peut naviguer
192
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Modification d'un arbre


// le document permet de crer des Element, Text, CDATASection, et commentaire Document doc = ; Element elem = doc.createElement("message"); Text text = doc.createTextNode("mon texte"); // ajouter ou supprimer un attribut dans une balise elem.setAttribute("attr1", "valeur1"); elem.removeAttribute("attr2"); // ajouter ou supprimer un fils (Element/Text/CDATASection/Comment) dans un Element elem1.appendChild(fils); elem1.insertBefore(nouveauFils, refFils); elem1.removeChild(fils);

193
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Exemple : construction d'un arbre


Document doc = documentBuilder.newDocument(); Element message = doc.createElement("message"); message.appendChild(root); Element to = doc.createElement("to"); message.appendChild(to); Text toText = doc.createTextNode("me@hotmail.fr"); to.apprendChild(toText); Element from = doc.createElement("from"); message.appendChild("from"); .

194
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Srialisation d'un arbre


La classe javax.xml.transform.Transformer permet d'crire un arbre XML vers un texte.
public static void write(Element root, OutputStream out) throws Exception { Transformer transformer = TransformerFactory.newInstance().newTransformer(); DOMSource domSource = new DOMSource(root); transformer.transform(domSource, new StreamResult(out)); }

195
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Spcification de l'implmentation de DOM


Comme SAX, l'API DOM est un ensemble d'interfaces. Il peut donc avoir diffrentes implmentations. La classe javax.xml.parsers.DocumentBuilderFactory permet dinstancier un objet DocumentBuilder avec une classe dimplmentation particulaire.
System.setProperty( "javax.xml.parsers.DocumentBuilderFactory ", "[une classe d'implmnation]"); DocumentBuilder builder = new DocumentBuilderFactory().newInstance(). newDocumentBuilder();
196
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Rcapitulatif : analyser un document XML


Obtenir DocumentBuilder
DocumentBuilder builder = DocumentBuilderFactory().newInstance().new DocumentBuilder();

Parser un document XML


Document d = builder.parse(inputStream);

Naviguer dans l'arbre


197
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Rcapitulation : criture d'un document XML


Obtenir DocumentBuilder
DocumentBuilder builder = DocumentBuilderFactory().newInstance().newDocum entBuilder();

Crer un arbre vide


Document d = builder.newDocument();

Crer des fils et les mettre dans l'arbre Srialiser l'arbre


write(rootElement, outputStream);
198
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Comparaison entre SAX et DOM


SAX
Traitement par vnements : les traiteurs d'vnements sont appels par le parseur. Capable de traiter un trs grand document : le document n'est pas gard dans la mmoire en intgralit. Pas possible de revenir sur les lments du pass.

DOM
Traitement par navigation : un arbre est d'abord construit. Ensuite, le programme y navigue. Pas optimal pour le grand document : le document doit tre intgralement charg dans la mmoire. Possible de naviguer dans tous les sens.

199
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

TP 8.2 DOM
Modifier l'appli de bibliothque (TP 6.1) pour supporter la sauvegarde et le chargement de donnes en format XML comme suit :

<?xml version="1.0"?> <Bibliotheque> <Livre nom="" auteur=""> <Exemplaire no="1" emprunteur="adherent1" /> <Exemplaire no="2" /> </Livre> . <Adherent id="adherent1" name="Jennifer Lopez" /> </Bibliotheque>

200
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich

Vous aimerez peut-être aussi