Académique Documents
Professionnel Documents
Culture Documents
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
5
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
La JVM fournit un environnement d'excution homogne (malgr l'htrognit des OS/ matriels)
6
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
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
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
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
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,
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
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
changerDeChaine(3)
19
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
23
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
p.conduire(v); } }
24
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
26
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
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
33
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
34
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
36
Ex. Eclipse
37
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
38
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Crer des classes dans le rpertoire source (par dfaut c'est le rpertoire du projet)
File New class
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
40
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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.
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
*/ (et non /* */ ).
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)
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
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?
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
50
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
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
52
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
53
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
Personne
equals() { // comparer par contenu (no de scu sociale) }
String
equals() { // comparer par contenu }
56
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Ex.2.
Soit la mthode imprimerInfoPersonne() dfinit
public void imprimerInfoPersonne(Personne p) { }
58
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
La solution:
getClass() : retrouver la classe d'objet
// obtenir le nom de la classe de l'objet System.out.println(param.getClass().getName());
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
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>>
AdaptateurWifi
envoyerDonner(..) recevoirDonner(..)
62
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
LecteurCD lirePiste()
LecteurDVD 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
Une classe abstraite peut avoir des mthodes vides ( redfinir par des sous-classes).
66
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
class C1 { public String a1; private String a2; public void m1(); private void m2(); }
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
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
71
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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.
// OK System.out.println( Calculatrice.valeurAbsolue(-25) ); // pas besoin de faire cela: Calculatrice c = new Calculatrice(); System.out.println( c.valeurAbsolue(-25) );
73
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
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
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
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
Classe Fichier
Un fichier a un nom et son contenu.
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
moveReplace Projet/src/Doc/Doc2.doc
crasement attendu
85
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
86
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
87
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
88
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
La classe OffreProduit a le rle d'vnement. Elle contient l'information sur le nom du produit, le prix, le temps de livraison.
90
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
92
Tableaux
Un tableau est une squence d'lments
Squence de donnes primitives
Ex. int[], char[], byte[]
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
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
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
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
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
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
101
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
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
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
107
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
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
Ecrire une classe d'implmentation de filtre (classe FiltreIntPair) pour filtrer des objets de type Integer
Les nombres impairs sont filtrs
112
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
114
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
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.
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
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)
121
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
123
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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 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 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
128
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
130
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
public class Livre implements Serializable { String nom; String auteur; List<Exemplaire> exemplaires; }
131
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
133
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
134
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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.
137
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
138
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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.
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
142
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
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
Producteurs
File de messages
Consommateurs
147
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 consommateurs
Quand la file est vide : Bloquer Quand il existent des donnes dans la file : Dbloquer.
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
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
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.
Ecrivain 1
Lecteur 2
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Ecrivain 2
152
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.
A vous d'essayer
Ecrire le code de la classe Semaphore
155
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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]
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?
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
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
160
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
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
<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
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 < > par > & par & ' par ' " par "
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
169
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
Est-ce correct?
170
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
Construire un document
174
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
<?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)
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()
179
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
3: getLineNumber() getConsumeNumer()
181
Traitement d'erreurs
XMLReader gnre des erreurs lors du parcours du document
methode void parse(org.xml.sax.InputSource input) throws IOException, SAXException
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.
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
En excution
java.lang.System.setProperty("property1", "valeur1");
184
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
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
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.
189
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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
192
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
193
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
194
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
195
Programmation Oriente Objet, universit Paris X, Prawee Sriplakich
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