Vous êtes sur la page 1sur 56

Le langage Java

Cours Elec5 EPU


Granet Vincent
12 octobre 2016

Bibliography

0-0

V. Granet U.N.S.A. Le langage Java 1

Part 1: Bibliography

References
[1] Vincent Granet and Jean-Pierre Regourd.
Aide-Memoire de Java. Dunod, 2 edition,
2008.
[2] Bertrand Meyer. Conception et
Programmation orientees objet. Eyrolles, 2000.
[3] Walter Savitch. Java, an Introduction to
Computer Science and Programming.
Prentice-Hall, 1999.
[4] H.M. Deitel and P.J. Deitel. Java. How to
Introduction
program. Prentice-Hall, 1998.
[5] J. Skansholm. Java From the Beginning.
Addison Wesley, 2000.
[6] R. Lafore. Data Structures and Algorithms in
Java. Wait Group Press, 1998.
[7] Vincent Granet. Algorithmique et
programmation en Java. Dunod, 2 edition,
2004.
[8] Web Java. voir http://java.sun.com.

V. Granet U.N.S.A. Le langage Java 2 V. Granet U.N.S.A. Le langage Java 3


Part 2: Introduction Part 2: Introduction

Langage a objets vs langage procedural Historique

criteres de justesse et fiabilite 1991, J. Gosling et Sun. Langage pour


structuration autour des actions programmer des processeurs embarques
programmation descendante par dans des appareils electromenagers
raffinements successifs Origine du nom : Oak puis Java (kawa)
structuration autour des objets 1994, Java utilise pour ecrire un navigateur
perinite des objets par rapport aux actions Web (futur HotJava)
Netscape inclut un interprete Java dans
objet = attributs + methodes son navigateur
programme = collection dobjets
2000, Java 2 (J2SE - J2EE)
dynamiques qui sont en interaction
Java langage de programmation a usage
envoie de messages
general + application pour le Web (applet
extensibilite, compatibilite, reutilisabilite
= little application)
Java embarque : PDA, telephones mobiles
2009 Oracle rachete Sun
2011, Java 7
2014, Java 8 - -fonctions

V. Granet U.N.S.A. Le langage Java 4 V. Granet U.N.S.A. Le langage Java 5

Part 2: Introduction Part 2: Introduction

Avantages Inconvenients

langage a objets produit industriel


syntaxe simple temps dexecution - Interpretation (mais
notation issue de C JIT)
portabilite API tres (trop ?) vaste, difficile a matriser
API tres vaste constructions archaques issues de C
javadoc temps reel
interfaces graphiques (awt, Swing)
environnement jdk gratuit

V. Granet U.N.S.A. Le langage Java 6 V. Granet U.N.S.A. Le langage Java 7


Part 2: Introduction Part 2: Introduction

Premieres applications Compter les caracteres

/* ma premiere application Java */ /* * La classe Wc ecrit le nombre de caracteres


c l a s s HelloWorld { * lus sur l entree standard
public static v o i d main ( String [] args ) { */
System . out . println (" Hello World ! " ); i m p o r t java . io .*;
} public c l a s s Wc {
} // fin classe HelloWorld public static v o i d main ( String [] args )
t h r o w s IOException
{
i n t nbc = 0; // compteur de caracteres

w h i l e ( System . in . read () != -1)


/* ma premiere applet Java */ nbc ++;
i m p o r t java . awt . Graphics ; // fin de fichier de lentree standard
i m p o r t java . applet . Applet ; System . out . println ( nbc );
}
public c l a s s HelloWorldApplet e x t e n d s Applet { } // fin classe Wc
p u b l i c v o i d paint ( Graphics g ) {
g . drawString ( " Hello World ! " , 5 , 25);
}
} // fin classe HelloWorldApplet

V. Granet U.N.S.A. Le langage Java 8 V. Granet U.N.S.A. Le langage Java 9

Part 2: Introduction Part 2: Introduction

Principe de compilation Comment compiler et executer ?

interpretation
$ javac HelloWorld.java
$ java HelloWorld
compilateur Java Hello World!
source fichier
Java
Java Java bytecode
Java bytecode $ javac HelloWorldApplet.java
(.java) (.class)
$ appletviewer HelloWorldApplet.html

<applet
interprte
code="HelloWorldApplet.class" width=400 height=150>
Java
</applet>

la variable CLASSPATH
Production code a la volee (JIT)

V. Granet U.N.S.A. Le langage Java 10 V. Granet U.N.S.A. Le langage Java 11


Part 2: Introduction

La documentation

javadoc
produit une documentation en html
traite les commentaires /** */
reconnat des macros :
@author
@version
@param
@return
@see
... Les types elementaires
$ javadoc Wc.java
$ firefox index.html

V. Granet U.N.S.A. Le langage Java 12 V. Granet U.N.S.A. Le langage Java 13

Part 3: Les types elementaires Part 3: Les types elementaires

Les nombres Les booleens

Arithmetique classique boolean


byte (8 bits) false et true
short (16 bits) operateurs :
int (32 bits) ! la negation
long (64 bits) | la disjonction

123 0 98 067 0xAeF1


^ la disjonction exclusive
Byte.MIN VALUE Byte.MAX VALUE & la conjection
Short.MIN VALUE Short.MAX VALUE || la disjonction conditionnelle
Integer.MIN VALUE Integer.MAX VALUE && la conjection conditionnelle
Long.MIN VALUE Long.MAX VALUE

float (32 bits) i f (i < n && t [ i ]) {


....
double (64 bits)

123.12 0. .12 98. 3.5e-7 1.5e2


Float.MIN VALUE Float.MAX VALUE
Double.MIN VALUE Double.MAX VALUE

V. Granet U.N.S.A. Le langage Java 14 V. Granet U.N.S.A. Le langage Java 15


Part 3: Les types elementaires Part 3: Les types elementaires

Les caracteres Les conteneurs

char Les valeurs des types elementaires ne sont


jeu de caracteres Unicode sur 16 bits pas des objets (au sens de la
www.unicode.org programmation objet)
constantes denotees en apostrophes (e.g.
a, 4, , etc.) Byte Short Integer Long
caracteres speciaux : Float Double
\b \f \n \r \t \\ \ Boolean
valeur hexadecimale : \uxxxx (e.g. \u0041) Character
int nbEleves;
double ; mais conversions implicites (jdk1.5)

Integer i = 5;
c h a r c = new Character ( z );

V. Granet U.N.S.A. Le langage Java 16 V. Granet U.N.S.A. Le langage Java 17

Part 4: Les enonces

Les enonces conditionnels

meme semantique que C


if
switch

Les enonces

V. Granet U.N.S.A. Le langage Java 18 V. Granet U.N.S.A. Le langage Java 19


Part 4: Les enonces Part 4: Les enonces

Les enonces iteratifs


public static v o i d main ( String [] args ) t h r o w s IOEx
{
final d o u b l e = 0.0001; // precision du calcul
meme semantique que C
d o u b l e a = StdInput . readDouble () , while
b = StdInput . readDouble () , do-while
c = StdInput . readlnDouble () ,
r1 , r2 , i1 , i2 , ;
for
// a6=0, b et c coefficients reels de
// lequation du second degre, ax2 + bx + c
= ( b * b ) -4* a * c; public static l o n g factorielle ( l o n g n )
i f ( >=0) { // calcul des racines reelles // Antecedent: n > 0

i f (b >0) r1 = -( b + Math . sqrt ())/(2* a ); // Consequent: factorielle=n!

e l s e r1 = ( Math . sqrt () -b )/(2* a ); {


// r1 est la racine la plus grande en valeur absolue l o n g i = 0 , fact = 1;
r2 = Math . abs ( r1 ) < ? 0 : c /( a * r1 ); // Invariant : fact=i!

i1 = i2 = 0; w h i l e (i < n ) {
// (x-r1)(x-r2)=0 // fact * (i+1) = i!*(i+1) et i<n

} i ++;
e l s e { // calcul des racines complexes // fact*i = i!

r1 = r2 = -b /(2* a ); fact *= i ;
i1 = Math . sqrt ( -)/(2* a ); i2 = - i1 ; // fact = i!

} }
// (x-(r1+ii1)) (x-(r2+ii2)) = 0 // i=n et fact = i! = n!

// ecrire les racines solutions sur la sortie standard return fact ;


System . out . println (" r1 = ( " + r1 + " ," + i1 + " ) " ); }
System . out . println (" r2 = ( " + r2 + " ," + i2 + " ) " );
}

V. Granet U.N.S.A. Le langage Java 20 V. Granet U.N.S.A. Le langage Java 21

Part 5: Les objets

Objets et Classes

application = collection dobjets


dynamiques en interaction
objet = fournisseur de services
utilises par des clients
programmation par contrat. B.
Meyer.
classe = moule a objets
une classe nest pas un objet (en
Les objets
Java)
un objet est une instance dune
classe
attributs et methodes

c l a s s Rectangle {
d o u b l e largeur , longueur ;
}

V. Granet U.N.S.A. Le langage Java 22 V. Granet U.N.S.A. Le langage Java 23


Part 5: Les objets Part 5: Les objets

Creation des objets References

La variable r est une reference a lobjet, et non pas


Rectangle r;
r = new Rectangle (); lobjet lui-meme.

Pb de laffectation, de la comparaison et du
passage de parametre.
ou

Rectangle q = r ;
Rectangle r = new Rectangle ();

largeur 0.0
largeur 0.0 r q
longueur 0.0
r rfrence rfrence
longueur 0.0
rfrence

objet de type Rectangle

V. Granet U.N.S.A. Le langage Java 24 V. Granet U.N.S.A. Le langage Java 25

Part 5: Les objets Part 5: Les objets

Les constructeurs Destruction des objets

pour initialiser lobjet construit automatique en Java


du nom de la classe
a la charge du support dexecution
constructeur par defaut (e.g. Rectangle())
va dans le sens de la securite
valeur initiale 0 (0.0, \u0000, false , null )

// construit un Rectangle de largeur l et de longueur L


Rectangle ( d o u b l e l , d o u b l e L ) {
largeur = l; longueur = L ;
}

Le constructeur par defaut est perdu ! Il faut le


redefinir.

// construit un Rectangle de largeur et de longueur egales a 0


Rectangle () {
largeur = longueur = 0.0;
}

V. Granet U.N.S.A. Le langage Java 26 V. Granet U.N.S.A. Le langage Java 27


Part 5: Les objets Part 5: Les objets

Les methodes Acces aux attributs et aux methodes

procedures et fonctions notation pointee


objet = automate a etats
une procedure modifie letat r.largeur;
une fonction renvoie une description de r.perimetre();
letat
modele pas toujours possible attributs publics
attributs prives
c l a s s Rectangle {
d o u b l e largeur , longueur ;
c l a s s Rectangle {
// modifie la largeur du Rectangle courant p r i v a t e d o u b l e largeur , longueur ;
v o i d changerLargeur ( d o u b l e l ) { // modifie la largeur du Rectangle courant

largeur = l ; p u b l i c v o i d changerLargeur ( d o u b l e l ) {
} largeur = l ;
}
// renvoie le perimetre du Rectangle courant // renvoie le perimetre du Rectangle courant

d o u b l e perimetre () { p u b l i c d o u b l e perimetre () {
r e t u r n 2 * ( largeur + longueur ); r e t u r n 2 * ( largeur + longueur );
} }
} }

V. Granet U.N.S.A. Le langage Java 28 V. Granet U.N.S.A. Le langage Java 29

Part 5: Les objets Part 5: Les objets

Methodes et attributs statiques Paquetages(1/2)

Paquetage = ensemble de classes dune


static i n t partage ; meme thematique (java.awt, java.lang,
static v o i d uneMethode () { ... } java.math, ...)
java javax org

Existent independamment de la creation


des objets applet awt io lang
Accessibles avec le nom de la classe
System.out des attributs p a c k a g e monpaquetage ;
Math.PI p a c k a g e mon . paquetage ;
p a c k a g e java . io ;
Math.exp(13.4) des methodes
Math.sin(3.14)
StdInput.readInt() le paquetage est un repertoire du systeme
main de fichiers
par defaut une classe appartient au
repertoire courant
Les methodes statiques remettent en cause le
CLASSPATH
modele objet !

V. Granet U.N.S.A. Le langage Java 30 V. Granet U.N.S.A. Le langage Java 31


Part 5: Les objets Part 5: Les objets

Paquetages(2/2) Portees

Notation qualifiee : les classes

defaut le paquetage
java . util . Random r = new java . util . Random ();
public partout
les attributs et les methodes

mais
defaut le paquetage
public partout
i m p o r t java . util . Random ;
Random r = new Random (); private la classe
protected classe
sous-classes
Exemples paquetage

i m p o r t paquetage . classe ;
i m p o r t paquetage .*;
i m p o r t java . awt . Canvas ;
i m p o r t java . io .*;

V. Granet U.N.S.A. Le langage Java 32 V. Granet U.N.S.A. Le langage Java 33

Part 6: Les chanes de caracteres

Les chanes de caracteres(1/3)

Les chanes de caracteres sont des objets


String et StringBuilder

String s = " Hello " ;

est equivalent a

Les chanes de caracteres


String s = new String ( " Hello " );

la position du 1er caractere est a 0


operateur de concatenation +
attribut length longueur du chane

V. Granet U.N.S.A. Le langage Java 34 V. Granet U.N.S.A. Le langage Java 35


Part 6: Les chanes de caracteres Part 6: Les chanes de caracteres

Les chanes de caracteres (2/3)


String prenom = " Pierre " ,
nom = " Martin " ;
La concatenation peut provoquer une
System . out . println ( prenom + " " + nom ); conversion implicite
System . out . println ( prenom . length );

System . out . println (5 + " 2 " );

pour un objet : appel implicite a la


methode toString.

p u b l i c String toString () {
r e t u r n " Rectangle ( " + largeur + " ,"
+ longueur + " )" ;
}

V. Granet U.N.S.A. Le langage Java 36 V. Granet U.N.S.A. Le langage Java 37

Part 6: Les chanes de caracteres

Les chanes de caracteres (3/3)

char charAt(int index)


int indexOf(int ch)
int indexOf(int ch, int index)
int indexOf(String str)
int indexOf(String str, int index)
String substring(int beginIndex)
String toLowerCase()
String toUpperCase() Les tableaux
int compareTo(String s)
boolean equals(String s)

i n t pos = 0; // position du modele dans le texte

w h i l e (( pos = texte . indexOf ( modele , pos )) != -1)


System . out . println ( pos ++);

V. Granet U.N.S.A. Le langage Java 38 V. Granet U.N.S.A. Le langage Java 39


Part 7: Les tableaux Part 7: Les tableaux

Tableaux a une dimension (1/4)


d o u b l e [] t3 = { 3.4 , 2.0 , -34 }; // 3 reels doubles
t1 = new i n t [] { 1 , 2 , 3 }; // 3 entiers
les tableaux sont des objets (mais pas
dheritage)
declaration :

i n t [] t ; // t est un tableau dentiers

La declaration dun tableau NE cree PAS ses com-


posants

i n t [] t1 = new i n t [ 10 ]; // 10 entiers
Complexe [] t2 = new Complexe [5]; // 5 references

composants de t[0] a t[max-1]


initialisation a 0, false , \u0000ou null

V. Granet U.N.S.A. Le langage Java 40 V. Granet U.N.S.A. Le langage Java 41

Part 7: Les tableaux Part 7: Les tableaux

Tableaux a 1 dimension (2/4) Tableaux a 1 dimension (3/4)

la taille du tableau est fixee a sa creation


lattribut length retourne le nb de public c l a s s Table {
composants private i n t [] tab ;
length ne peut pas etre modifie // le generateur de nombres alearoires
p r i v a t e Random rand = new Random ();
p u b l i c Table ( i n t n )
Les variables de type tableau sont des references. // R^
ole: initialise le tableau tab de facon aleatoire
{
Les operateurs = et == noperent pas sur les compo- i f (n <=0) {
sants ! System . err . println ( " taille <= 0 " );
t1 = t2 affectation de references System . exit (1);
}
t1 == t2 comparaison de references tab = new i n t [ n ];
idem pour le passage de parametres tableaux f o r ( i n t i = 0; i < tab . length ; i ++)
// les elements tab[0]..tab[i-1] sont
// initialises de facon aleatoire
tab [ i ] = rand . nextInt ();
t = ( i n t []) t1 . clone (); }
System . out . println ( Arrays . equals (t , t1 )); } // fin classe Table

V. Granet U.N.S.A. Le langage Java 42 V. Granet U.N.S.A. Le langage Java 43


Part 7: Les tableaux Part 7: Les tableaux

Tableaux a 1 dimension (4/4) Parametres de lapplication

tableau de chanes de caracteres


parametre de la fonction main
/* Trie une table par selection ordinaire */
p u b l i c v o i d selectionOrdinaire () {
f o r ( i n t i = 0; i < tab . length - 1 ; i ++) {
// le tableau tab[0..i-1] est trie, et ces elements /* *
// sont inferieurs a ceux de tab[i..tab.length-1] * Cette application ecrit sur la sortie standard
i n t min = i; * ses parametres passes lors de son execution
// chercher la place du min dans tab[i..tab.length-1] */
f o r ( i n t j = i +1; j < tab . length ; j ++) c l a s s Echo {
i f ( tab [ j] < tab [ min ]) min = j ; public static v o i d main ( String [] args ) {
// echanger le ieme et lelement min f o r ( i n t i = 0; i < ( args . length -1); i ++)
echanger ( min , i ); System . out . print ( args [ i ] + " " );
} // ecrire le dernier parametre et le passage a la ligne
} System . out . println ( args [ args . length -1]);
p r i v a t e v o i d echanger ( i n t i , i n t j ) { }
// echange les valeurs de tab[i] et tab[j] }
i n t temp = tab [i ];
tab [ i ] = tab [j ];
tab [ j ] = temp ;
}

V. Granet U.N.S.A. Le langage Java 44 V. Granet U.N.S.A. Le langage Java 45

Part 7: Les tableaux Part 7: Les tableaux

Tableaux a plusieurs dimensions (1/3) Tableaux a plusieurs dimensions (2/3)

comme en C tableaux de tableaux


memes remarques qua une dimension c l a s s Matrice {
// Invariant : this est une matrice (lignes,colonnes)
p r i v a t e d o u b l e [][] m ;
d o u b l e [][] matriceD = new d o u b l e [m ][ n ]; public final i n t nblgs , nbcols ;
Complexe [][][] matriceC = new Complexe [ m ][ n ][ t ]; // le generateur de nombres alearoires
p r i v a t e Random rand = new Random ();

public Matrice ( i n t l , i n t c )
// R^
ole: creer une matrice (l,c)
le nombre de composants des dimensions
{ // verifier que l et c sont > 0
peut etre different ...
m = new i n t [ l ][ c ];
nblgs = l; nbcols = c ;
d o u b l e [][] matriceD = new d o u b l e [m ][]; ...
}
matriceD [0] = new d o u b l e [5]; } // fin classe Matrice
matriceD [1] = new d o u b l e [10];
...

V. Granet U.N.S.A. Le langage Java 46 V. Granet U.N.S.A. Le langage Java 47


Part 7: Les tableaux

Tableaux a plusieurs dimensions (3/3)

p u b l i c Matrice produit ( Matrice m ) {


// Antecedent : this(n,k) et m(k,p) sont
// des matrices initialisees
// Consequent : renvoie une matrice (n,p)
// produit de this par m
Matrice c =
new Matrice ( t h i s . nblgs ,m . nbcols );
f o r ( i n t i = 0; i < c . nblgs ; i ++)
f o r ( i n t j = 0; j < c . nbcols ; j ++) {
// x 0..i 1, y 0..j 1,
P
// c x, y = k = 1pthis xkm ky Heritage
d o u b l e somme =0;
f o r ( i n t k = 0; k < t h i s . nbcols ; k ++)
somme += t h i s .m [ i ][ k ]* m . m [ k ][ j ];
c . m [i ][ j ] = somme ;
}
r e t u r n c;
}

V. Granet U.N.S.A. Le langage Java 48 V. Granet U.N.S.A. Le langage Java 49

Part 8: Heritage Part 8: Heritage

Introduction Classe heritieres (1/2)

propriete fondamentale des langages a


objets
public c l a s s Carre {
outil de la reutilisabilite // Invariant de classe : cote > 0

bibliotheques de classes extensibles p r i v a t e d o u b l e cote ;

p u b l i c Carre ( d o u b l e c )
{
cote = c ;
}
p u b l i c d o u b l e perimetre ()
// R^
ole: retourne le perimetre du carre
{
r e t u r n 4* cote ;
}
p u b l i c d o u b l e surface ()
// R^
ole: retourne la surface du carre
{
r e t u r n cote * cote ;
}
} // fin classe Carre

V. Granet U.N.S.A. Le langage Java 50 V. Granet U.N.S.A. Le langage Java 51


Part 8: Heritage Part 8: Heritage

Classe heritieres (2/2) Heritage ou client

un carre est un rectangle particulier relation est-un


reutilisation de la classe Rectangle relation a-un
mais ...

public c l a s s Carre e x t e n d s Rectangle {


// Invariant de classe : largeur == longueur > 0 public c l a s s Rectangle {
p u b l i c Carre ( d o u b l e c) { Point origine ;
s u p e r (c ,c ); ...
} }
p u b l i c v o i d changerCote ( d o u b l e cote ) {
// R^
ole: met a jour le cote
s u p e r . changerLargeur ( cote );
s u p e r . changerLongueur ( cote );
}
ou
}

public c l a s s Rectangle e x t e n d s Point {


....
}
protected
super et super()
la classe Object
le graphe dheritage
heritage = specialisation et extension

V. Granet U.N.S.A. Le langage Java 52 V. Granet U.N.S.A. Le langage Java 53

Part 8: Heritage Part 8: Heritage

Redefinition des methodes (1/2) Redefinition des methodes (2/2)

les classes heritieres peuvent redefinir des


methodes Rectangle r = new Rectangle (2 ,4);
elles doivent posseder la meme signature Carre c = new Carre (6);
(sinon surcharge)
System . out . println ( r ); // r.toString()
les classes Rectangle et Carre definissent System . out . println ( c ); // c.toString()
les methodes suivantes :

// Dans la classe Rectangle


p u b l i c String toString () rectangle de largeur 2 et de longueur 4
{ carre de cote egal a 6
r e t u r n " rectangle de largeur " + largeur
+ " et de longueur " + longueur ;
}
// Dans la classe Carre
p u b l i c String toString ()
{
r e t u r n " carre de cote egal a " + largeur ;
}

V. Granet U.N.S.A. Le langage Java 54 V. Granet U.N.S.A. Le langage Java 55


Part 8: Heritage Part 8: Heritage

Recherche dun attribut ou dune methode Polymorphisme (1/2)

chaque fois que lon desire acceder a un langages polymorphiques et non


attribut ou une methode dune occurrence polymorphiques (langage type et non type)
dobjet dune classe C, il devra etre defini polymorphisme dans les langages de classes
soit dans la classe C, soit dans lun de ses est controle par lheritage
ancetres.
si lattribut ou la methode nest pas
Rectangle r;
trouve, cest une erreur Carre c = new Carre (3);
sil y a eu des redefinitions, sa premiere
apparition en remontant le graphe r = c; // valide : un carre est rectangle
c = r; // erreur de compilation !
dheritage sera choisie. // un rectangle nest pas (forcement) un carre

Cast : c = (Carre) r ; si on est sur que r


est un Carre
Exemple une classe Forme pour representer
les formes geometriques quelconques

V. Granet U.N.S.A. Le langage Java 56 V. Granet U.N.S.A. Le langage Java 57

Part 8: Heritage Part 8: Heritage

Polymorphisme (2/2) Liaison dynamique

Forme
tf [0] = new Rectangle (3 ,10);
tf [1] = new Cercle (7);
...
tf [0] = tf [1]; // tf[0] designe un cercle ?
...
Ellipse Rectangle System . out . println ( tf [0]); // toString() de Cercle ?

lorsque quil y a des redefinitions de


methodes, cest a lexecution que lon
Cercle Carr connat la methode a appliquer.
elle est determinee a partir de la forme
dynamique de lobjet sur lequel elle
sapplique.
Forme [] tf = new Formes [10];
Interet :
localisation
evite le pb du switch

V. Granet U.N.S.A. Le langage Java 58 V. Granet U.N.S.A. Le langage Java 59


Part 8: Heritage Part 8: Heritage

Classes et methodes abstraites Heritage simple vs multiple

Une methode abstraite nest definie que en Java lheritage est simple
par sa signature evite les pb complexes de recherche des
Introduite par le mot-cle abstract noms de lheritage multiple
Une classe peut etre declaree abstraite,
elle decrit des caracteristiques mais pas un Cercle Carr
fonctionnement

public abstract c l a s s Forme {


p u b l i c a b s t r a c t i n t perimetre (); CercledansCarr
p u b l i c a b s t r a c t i n t surface ();
}

les interfaces permettent un heritage


multiple simplifie

Une classe abstraite ne peut etre instanciee !

V. Granet U.N.S.A. Le langage Java 60 V. Granet U.N.S.A. Le langage Java 61

Part 8: Heritage Part 8: Heritage

Interfaces (1/2) Interfaces (2/2)

pour une forme simplifiee de lheritage une classe peut se comporter comme une
multiple ou plusieurs interfaces
pour la genericite Elle doit implanter (implements) le ou les
ce sont des classes dont toutes les interfaces
methodes sont implicitement abstraites elle et ses descendants sengagent a definir
elles ne possedent pas dattribut, a le corps des methodes de linterface
lexception de constantes
ne peuvent pas etre instanciees
c l a s s MaClasse i m p l e m e n t s MonInterface {
p u b l i c v o i d uneMethode ( i n t x ) {
....
public i n t e r f a c e MonInterface { }
static final i n t uneConstate = 10; }
a b s t r a c t p u b l i c v o i d uneMethode ( i n t x );
}

Serializable
Cloneable
Runnable
ActionListener
...

V. Granet U.N.S.A. Le langage Java 62 V. Granet U.N.S.A. Le langage Java 63


Part 8: Heritage Part 8: Heritage

Interfaces et Polymorphisme
I [] table = new I [10];

les interfaces permettent un polymorphisme table [0] = new C1 ();


independant de la hierarchie dheritage table [1] = new C2 ();
table [2] = new C3 ();
une variable de type interface I peut designer
nimporte quel objet de toute classe qui implante
cette interface.

c l a s s C1 i m p l e m e n t s I {
...
}
c l a s s C2 i m p l e m e n t s I {
...
}
c l a s s C3 i m p l e m e n t s I {
...
}

V. Granet U.N.S.A. Le langage Java 64 V. Granet U.N.S.A. Le langage Java 65

Part 8: Heritage Part 8: Heritage

Interfaces et genericite(1/2) Interfaces et genericite(2/2)

appliquer un traitement des objets quel


que soit leur type c l a s s CarreComparable e x t e n d s Carre
jusqua la version 1.4.2 de Java, la i m p l e m e n t s EltComparable {
genericite est limitee et a mettre en uvre p u b l i c b o o l e a n infOu Egal ( EltComparable o) {
return t h i s . surface () <=
avec des interfaces (( CarreComparable ) o ). surface ();
version 1.5 : notion du langage a part }
entiere }
c l a s s PersonneComparable e x t e n d s Personne
On veut ecrire une methode de tri qui puisse trier i m p l e m e n t s EltComparable {
p u b l i c b o o l e a n infOu Egal ( EltComparable o) {
un tableau dobjets quelconques on doit
return t h i s . taille () <=
pouvoir les comparer (( PersonneComparable ) o ). taille ();
}
}
public static v o i d tri ( EltComparable [] t ) {
... t [ i ]. infOu Egal ( t [j ]) ...
}
i n t e r f a c e EltComparable {
p u b l i c b o o l e a n infOu Egal ( EltComparable o );
}

V. Granet U.N.S.A. Le langage Java 66 V. Granet U.N.S.A. Le langage Java 67


Part 8: Heritage

// trier des carres


CarreComparable [] t1 = {
new CarreComparable (3) , ... ,
new CarreComparable (12) , ...
};
C . tri ( t1 );

// trier des personnes


PersonneComparable [] t2 = {
new PersonneComparable (1.73) , ... ,
new PersonneComparable (1.90) ,
};
C . tri ( t2 );

Les exceptions

V. Granet U.N.S.A. Le langage Java 68 V. Granet U.N.S.A. Le langage Java 69

Part 9: Les exceptions Part 9: Les exceptions

Le probleme Traitement

Un evenement qui indique une situation anormale Une exception survient au cours de lexecution
pouvant provoquer un dysfonctionnement du dune action :
programme : reexecution de laction en changeant les
pb materiel (E/S, memoire, ...) conditions initiales dexecution ;
pb logiciel (division par zero, non respect transmission de lexception a
des invariants, ...) lenvironnement

tantque B f a i r e
...
s i erreur a l o r s
traiter erreur
E1
finsi
...
fintant
E2

le code normal et le traitement des E3


erreurs melanges
code de retour (souvent un entier) pauvre
en information
E4 exception
un mecanisme elabore : les exceptions

V. Granet U.N.S.A. Le langage Java 70 V. Granet U.N.S.A. Le langage Java 71


Part 9: Les exceptions Part 9: Les exceptions

Exceptions en Java Capture dune exception (1/2)

Les exceptions sont des objets clauses try-catch


situation anormale emission dune
exception
try {
java.lang.Exception java.lang.Throwable // code normal
...
Object
o. m (); // la methode m peut provoquer une exception
...
}
Throwable
c a t c h ( UneException e ) {
// code de traitement de lexception designee par e
...
}
Error Exception

IOException ........ clause finally


RuntimeException

finally {
ArithmeticException ........ // code execute quoiquil arrive
}

toutes les exceptions (sauf


RuntimeException ) doivent etre
explicitement capturees ou deleguees

V. Granet U.N.S.A. Le langage Java 72 V. Granet U.N.S.A. Le langage Java 73

Part 9: Les exceptions Part 9: Les exceptions

Capture dune exception (2/2) Delegation dune exception

une methode nest pas tenue de capturer


une exception
try {
i n t x = StdInput . readlnInt (); elle peut deleguer la capture a son
.... environnement
}
elle le signale avec la clause throws dans
c a t c h ( IOException e ) {
System . err . println ( e ); son en-tete
System . exit (1); sauf pour les exceptions de type
}
RuntimeException

p u b l i c v o i d maMethode () t h r o w s IOException {
i n t x = StdInput . readlnInt ();
public static i n t lirelnInt () { ....
try { }
r e t u r n StdInput . readlnInt ();
}
c a t c h ( IOException e ) {
System . err . println (e );
System . out . println (" reessayer : " );
r e t u r n lirelnInt ();
}
}

V. Granet U.N.S.A. Le langage Java 74 V. Granet U.N.S.A. Le langage Java 75


Part 9: Les exceptions Part 9: Les exceptions

Creer ses propres exceptions Emettre une exception

throw (sans s)
public c l a s s MonException e x t e n d s Exception {
i n t code ;
p u b l i c MonException () { p u b l i c v o i d uneMethode () {
s u p e r (); i f (...) {
} throw new ArithmeticException ();
p u b l i c MonException ( String msg ) { }
s u p e r ( msg ); ...
} }
p u b l i c MonException ( String msg , i n t c ) {
s u p e r ( msg );
code = c ; // c 6= 0
}
p u b l i c String toString () {
r e t u r n getMessage () + " " + code ; p u b l i c v o i d maMethode () t h r o w s MonException {
} i f (...) {
} throw new MonException (" une erreur " , 3);
}
...
}

la clause throws est obligatoire dans


len-tete de la methode qui leve une
exception (sauf RuntimeException)

V. Granet U.N.S.A. Le langage Java 76 V. Granet U.N.S.A. Le langage Java 77

Part 10: Les entrees/sorties

Flots doctets et de caracteres

flots sequentiels unidirectionnels


flots a acces direct
octets et caracteres Unicode
quatre classes de base :

lecture ecriture
flots doctets InputStream OutputStream
flots de caracteres Reader Writer
Les entrees/sorties
paquetage java.io

V. Granet U.N.S.A. Le langage Java 78 V. Granet U.N.S.A. Le langage Java 79


Part 10: Les entrees/sorties Part 10: Les entrees/sorties

Fichiers doctets Exemple : recopie dun fichier

Declaration :
p u b l i c v o i d copie ( String in , String out )
t h r o w s IOException
FileInputStream is = new FileInputStream ( " entree " );
{
FileOutputStream os = new FileOutputStream ( " sortie " );
FileInputStream is = new FileInputStream ( in );
FileOutputStream os = new FileOutputStream ( out );

i n t c;
w h i l e (( c = is . read ()) != -1)
methodes de base : os . write (c );
// EOF de is
int read()
is . close ();
void write(int) os . close ();
void close() }

V. Granet U.N.S.A. Le langage Java 80 V. Granet U.N.S.A. Le langage Java 81

Part 10: Les entrees/sorties Part 10: Les entrees/sorties

Fichier dobjets elementaires Fichier dobjets

DataInputStream et DataOutputstream ObjectInputStream et ObjectOutputstream


readChar, writeChar, readInt, writeInt, Object readObject()
readDouble, writeDouble, ... void writeObject(Object)
fin de fichier exception EOFException
Rectangle r = new Rectangle (3 ,4);
ObjectOutputStream os = new ObjectOutputStream (
p u b l i c d o u b l e moyenne ( String in ) new FileOutputStream ( " Frect " ));
t h r o w s IOException { // ecriture dun objet de type Rectangle sur le fichier os
DataInputStream is = new DataInputStream ( os . writeObject ( r );
new FileInputStream ( in )); os . close ();
i n t nb Elem = 0; ObjectInputStream is = new ObjectInputStream (
d o u b l e moy = 0; new FileInputStream ( " Frect " ));
try { // lecture dun objet de type Rectangle sur le fichier is
while ( true ) { r = ( Rectangle ) is . readObject ();
moy += is . readDouble (); // la conversion necessaire
nb Elem ++; is . close ();
}
}
c a t c h ( EOFException e) {
is . close ();
interface Serializable
}
r e t u r n nb Elem == 0 ? 0 : moy / nb Elem ;
}
public c l a s s Rectangle
i m p l e m e n t s Serializable {

V. Granet U.N.S.A. Le langage Java 82 V. Granet U.N.S.A. Le langage Java 83


Part 10: Les entrees/sorties Part 10: Les entrees/sorties

Fichier de texte
FileReader is = new FileReader ( " entree " );
b o o l e a n etatDansMot = f a l s e ;
- caracteres Unicode
i n t c , nbCar = 0 , nbMots = 0 , nbLignes = 0;
- FileReader et FileWriter w h i l e (( c = is . read ()) != -1) {
// incrementer le compteur de caracteres
nbCar ++;
i f ( c == || c == \ t || c == \ n ) {
// c est un separateur de mot
i f ( etatDansMot ) etatDansMot = f a l s e ;
i f ( c == \n )
// fin dune ligne incrementer le compteur de lignes
nbLignes ++;
}
e l s e // on est dans un mot
i f (! etatDansMot ) {
// 1er car du mot incrementer le compteur de mots
nbMots ++;
etatDansMot = t r u e ;
}
}
// fin de fichier afficher les resultats
is . close ();
System . out . println ( nbLignes + " " + nbMots
+ " " + nbCar );

V. Granet U.N.S.A. Le langage Java 84 V. Granet U.N.S.A. Le langage Java 85

Part 10: Les entrees/sorties Part 10: Les entrees/sorties

E/S bufferisees Entree et sortie standard

Pour ameliorer les performances, les lectures et System.in de type InputStream


les ecritures utilisent une zone tampon. System.out de type PrintStream
BufferedInputStream, System.err de type PrintStream
BufferedOutputStream La classe PrintStream propose des methodes print
BufferedReader, BufferedWriter et println pour ecrire tout type dobjet apres
conversion en chane de caracteres avec
FileInputStream is =
toString()
new FileInputStream (" entree " );
FileOutputStream os =
new FileOutputStream ( " sortie " );
System.in ne permet de lire que des octets. Pas de
conversion de type implicite classe locale StdIn-
BufferedInputStream bis = put
new BufferedInputStream ( is );
BufferedOutputStream bos =
new BufferedOutputStream ( os );

d o u b l e x = System . in . read (); // suspect


d o u b l e x = StdInput . readlnDouble ();

V. Granet U.N.S.A. Le langage Java 86 V. Granet U.N.S.A. Le langage Java 87


Part 11: Fonctions anonymes (Lambda)

Introduction

depuis la version 8 de Java


API fortement recrite + nouveautes
(Stream)
modele fonctionnel (lisp, haskell, ...)
fonction sans nom (anonyme)

(x, y) x + y

valeur fonctionnelle :

Fonctions anonymes (Lambda)


(x , y ) -> x + y
( i n t x , i n t y ) -> x + y

V. Granet U.N.S.A. Le langage Java 88 V. Granet U.N.S.A. Le langage Java 89

Part 11: Fonctions anonymes (Lambda) Part 11: Fonctions anonymes (Lambda)

Type dune fonction anonyme (1/3) Type dune fonction anonyme (2/3)

Cest une interface fonctionnelle (une seule


methode abstraite) ( x ) -> { assert x >=0;
r e t u r n Math . sqrt ( x );
i n t e r f a c e FoncInt { }
i n t apply ( i n t x , i n t y );
} () -> {
System . out . print ( " n = " );
i n t n = StdInput . readlnInt ();
FoncInt f = (x , y ) -> x + y ; System . out . println ( n * n );
FoncInt f = (x , y ) -> x * x + y ; }

i n t e r f a c e FoncDouble {
d o u b l e apply ( d o u b l e x );
}

i n t e r f a c e Procedure {
v o i d apply () t h r o w s IOException ;
}

V. Granet U.N.S.A. Le langage Java 90 V. Granet U.N.S.A. Le langage Java 91


Part 11: Fonctions anonymes (Lambda) Part 11: Fonctions anonymes (Lambda)

Type dune fonction anonyme (3/3) Utilisation

Les fonctions anonymes peuvent etre generiques Evaluation (inference de types)

i n t e r f a c e BiFunction <T , U , R > { FoncInt f = (x , y ) -> x + y ;


R apply ( T t , U u ); System . out . println ( f . apply (2 ,3)); // 5
}

BiFunction < Integer , Integer , Integer > f =


(x ,y ) -> x + y ; Lambda en parametre

p u b l i c d o u b l e calculerAire ( d o u b l e a ,
java.util.function d o u b l e b , i n t n , Function < Double , Double > f )

Lambda resultat de fonction

// (g f )(x) = g(f (x))


<T ,R ,Z > Function <T ,Z > compose ( Function <T ,R > f ,
Function <R ,Z > g ) {
r e t u r n x -> g . apply ( f . apply ( x ));
}

V. Granet U.N.S.A. Le langage Java 92 V. Granet U.N.S.A. Le langage Java 93

Part 11: Fonctions anonymes (Lambda) Part 11: Fonctions anonymes (Lambda)

Fermeture Methodes par defaut

Occurrences liees vs libres plusieurs methodes dans une interface


En Java, la portee est statique fonctionnelle ?
(environement de definition de la fct pour garantir la compatibilite avec
anonyme) lexistant (i.e. Iterable, Runnable, ...)
methodes par defaut ( default )

i n t e r f a c e Procedure { v o i d apply (); }


...
public i n t e r f a c e Iterable <T > {
i n t x =1;
// methode a implementer
Procedure p = () -> { System . out . println ( x ); };
p u b l i c Iterator <T > iterator ();
p . apply ();
// methode par defaut
public d e f a u l t void
forEach ( Consumer <? s u p e r T > action ) {
f o r (T t : t h i s )
Les variables libres sont implicitement action . accept ( t );
}
final (i.e. elles ne peuvent donc pas etre
}
modifiees)

Procedure p = () -> { System . out . println ( x ++); };


// ERREUR DE COMPILATION !!!!!!!!!!

V. Granet U.N.S.A. Le langage Java 94 V. Granet U.N.S.A. Le langage Java 95


Part 12: LAPI

Application Programming Interface

ensemble de classes pretes a lemploi


couvre de nombreux aspects de
linformatique
facilite la construction des applications
offre des algorithmes efficaces
collections
arithmetique precision infinie
gestion dimages 2D et3D
gestion du son
LAPI interfaces graphiques et applet
processus legers - synchronisation
reseau (URL, modele client-serveur RMI,
objets distribues IDL Corba)
beans
base de donnees (jdbc)
reflexivite
SDK (mecanismes de securite)

V. Granet U.N.S.A. Le langage Java 96 V. Granet U.N.S.A. Le langage Java 97

Part 12: LAPI Part 12: LAPI

Collections et Tables Collections

paquetage java.util Collection

Vector, tableaux dynamiques


Hashtable, tables dadressage disperse
List Set
Stack, piles
ensembles
listes ArrayList Vector LinkedList SortedSet HashSet

arbres
algorithmes de tri TreeSet
algorithmes de recherche
... Liste et Ensembles generiques
Enonce foreach

List < String > vs = new Vector < String >();


SortedSet < String > ts = new TreeSet < String >( vs );

V. Granet U.N.S.A. Le langage Java 98 V. Granet U.N.S.A. Le langage Java 99


Part 12: LAPI Part 12: LAPI

La classe Vector Tables

tableau dynamique dont la taille est ajustable en


fonction des besoins
Map

Vector v = new Vector (3);

System . out . println ( v . size ()); // 0


SortedMap
f o r ( i n t i = 0; i < 10; i ++)
v. addElement (new Integer ( i * i ));
System . out . println ( v . size ()); // 10
System . out . println ( v . elementAt (3)); // 9
v . setSize (20); TreeMap HashMap Hashtable
v . setElementAt (new Integer (3) ,18);
System . out . println ( v . size ()); // 20
v . removeElementAt (0); Valeur + Cle
System . out . println ( v . size ()); // 19
v . removeAllElements ();
System . out . println ( v . size ()); // 0

V. Granet U.N.S.A. Le langage Java 100 V. Granet U.N.S.A. Le langage Java 101

Part 12: LAPI Part 12: LAPI

La classe Hashtable Les Properties

Table dont les elements sont reperes par des cles sous-classe de Hashtable
et dont lacces se fait par adressage disperse. correspondance cles et des valeurs String
une instance de Properties peut etre reliee
a une autre instance de Properties
lues et sauvegardees dans un fichier (texte
Hashtable < String , Integer > ht =
new Hashtable < String , Integer >();
ou XML)

ht . put ( " Paul " , 3);


ht . put ( " Pierre " ,19); Properties p1 = new Properties ();
Integer n = ht . get ( " Pierre " ); Properties p2 = new Properties ( p1 );
p1 . setProperty ( " Auteur " , " Moliere " );
i f ( n != n u l l ) p2 . setProperty ( " Compositeur " , " Bach " );
System . out . println ( " Pierre = " + n ); System . out . print ( p1 . getProperty ( " Auteur " ));
System . out . print ( p2 . getProperty ( " Compositeur " ));
System . out . println ( p2 . getProperty ( " Acteur " ," inconnu " ));

// proprietes de lenvironnement dexecution


System . out . print ( System . getProperty (" java . version " ));
System . out . print ( System . getProperty (" os . version " ));
System . out . println ( System . getProperty ( " os . arch " ));

V. Granet U.N.S.A. Le langage Java 102 V. Granet U.N.S.A. Le langage Java 103
Part 12: LAPI Part 12: LAPI

Threads Interfaces Graphiques

processus legers vs processus necessite des interfaces graphiques


execution (quasi) parallele des processus Abstract Window Toolkit (AWT)
partage de ressources communes Java Foundation Classes (JFC) Swing
interface runnable applet (little application)
synchronisation (methodes synchronized) programmation par evenements
composants graphiques (boutons, menus,
canvas, ascenseurs, botes de dialogue, etc.)
c l a s s MonThread e x t e n d s Thread {
p u b l i c MonThread () { ... }

p u b l i c v o i d run () { ... }
}
public c l a s s TestThread {
public static v o i d main ( String [] arg ) {
MonThread threadA = new MonThread () ,
threadB = new MonThread ();
threadA . start () // et non pas run()
threadB . start ();
}
}

V. Granet U.N.S.A. Le langage Java 104 V. Granet U.N.S.A. Le langage Java 105

Part 13: Introspection

Introspection

possibilite de consulter et dutiliser


dynamiquement la structure de classe des
objets.
necessaire pour les butineurs de classes,
debogueurs, ...
la classe Class et le paquetage
java.lang.reflect permet lintrospection

Introspection

V. Granet U.N.S.A. Le langage Java 106 V. Granet U.N.S.A. Le langage Java 107
Part 14: Beans

Beans (1/13)

grain (de cafe)


composant logiciel reutilisable destine a
etre manipule par un outil de
developpement interactif et graphique
(beanbox, beanbuilder, ...)
bean = classe Java
implemente linterface Serializable
constructeur public sans parametre
pour etre exploitable, un bean doit etre
Beans archive (format jar)

V. Granet U.N.S.A. Le langage Java 108 V. Granet U.N.S.A. Le langage Java 109

Part 14: Beans Part 14: Beans

Beans (2/13) Beans (3/13)

Un bean :
est capable dintrospection (reflect, i m p o r t java . awt .*;
inspector) i m p o r t java . io .*;
public c l a s s FirstBean e x t e n d s Canvas
possede des proprietes (accessibles par des i m p l e m e n t s Serializable {
methodes setXX(), getXX(), isXX()), final public static i n t RECTANGLE = 0;
final public static i n t CERCLE = 1;
realise la persitence (une fois crees, les
protected i n t forme = CERCLE ; // propriete
beans doivent pouvoir etre conserves) p u b l i c FirstBean () {
communication entre beans par des setSize (100 ,100); // taille du canvas
}
evenements
p u b l i c v o i d paint ( Graphics g ) {
g . drawRect (2 ,2 ,90 ,90);
g . setColor ( Color . red );
i f ( forme == RECTANGLE ) g. fillRect (10 ,10 ,20 ,20)
e l s e g . fillArc (10 ,10 ,20 ,20 ,0 ,360);
}
// methodes dacces a la proriete forme
p u b l i c i n t getForme () { r e t u r n forme ; }
p u b l i c v o i d setForme ( i n t f) { forme = f; }
}

V. Granet U.N.S.A. Le langage Java 110 V. Granet U.N.S.A. Le langage Java 111
Part 14: Beans Part 14: Beans

Beans (4/13) Beans (5/13)

Compilation et archivage Un bean source peut emettre un evenement qui


produit lexecution dune action sur un bean cible.
javac FirstBean.java
jar cvfm FirstBean.jar manifest.tmp FirstBean.class
1. definition de levenement (ObjectEvent)

fichier manifest i m p o r t java . util .*;


public c l a s s MyEvent e x t e n d s EventObject {
Name: FirstBean.class p u b l i c MyEvent ( Object o ) {
Java-Bean: True s u p e r ( o );
}
}

2. definition de lauditeur (EventListener)

i m p o r t java . util .*;


public i n t e r f a c e MyEventListener e x t e n d s EventListe
p u b l i c a b s t r a c t v o i d myEventPerformed ( MyEvent e
}

V. Granet U.N.S.A. Le langage Java 112 V. Granet U.N.S.A. Le langage Java 113

Part 14: Beans Part 14: Beans

Beans (6/13)
i m p o r t java . util .*;
public c l a s s Source {
3. gestion de lemission de levenement (source)
p r i v a t e Vector myEventListeners = new Vector ();
p u b l i c s y n c h r o n i z e d v o i d addMyEventListener ( MyEv
myEventListeners . addElement ( l );
}
p u b l i c s y n c h r o n i z e d v o i d removeMyEventListener ( M
myEventListeners . removeElement ( l );
}
p r o t e c t e d v o i d notifyMyEvent () {
Vector l ;
MyEvent e = new MyEvent ( t h i s );
synchronized ( t h i s ) {
// pour eviter toute modification
l = ( Vector ) myEventListeners . clone ();
}
f o r ( i n t i =0; i < l . size (); i ++) {
MyEventListener mel = ( MyEventListener ) l . ele
mel . myEventPerformed ( e );
}
}
...
// appel a notifyMyEvent pour emettre levenement
...
}

V. Granet U.N.S.A. Le langage Java 114 V. Granet U.N.S.A. Le langage Java 115
Part 14: Beans Part 14: Beans

Beans (7/13) Beans (8/13)

4. gestion de la reception (cible) Les proprietes peuvent etre liees (lien


unidirectionnel).

public c l a s s Cible i m p l e m e n t s MyEventListener {


Lorsquil y modification dune propriete liee, il
Source src = new Source (); faut notifier le changement.
p u b l i c Cible () {
src . addMyEventListener ( t h i s ); Elle envoie un PropertyChangeEvent chaque fois
} quelle change. Levenement est recu par les
p u b l i c v o i d myEventPerformed ( MyEvent e ) {
auditeurs qui implementent
// callback ...
} PropertyChangeListener.
}
PropertyChangeEvent possede les methodes :
getSource()
getOldValue()
getNewValue()
getPropertyName()

V. Granet U.N.S.A. Le langage Java 116 V. Granet U.N.S.A. Le langage Java 117

Part 14: Beans Part 14: Beans

Beans (9/13) Beans (10/13)

Le bean auditeur doit implementer linterface


i m p o r t java . beans .*;
PropertyChangeListener.
public c l a s s FirstBean e x t e n d s Canvas i m p l e m e n t s
....
p r i v a t e PropertyChangeSupport changes i m p o r t java . beans .*;
= new PropertyChangeSupport ( t h i s ) public c l a s s BeanAudit
p u b l i c v o i d addPropertyListener ( PropertyChangeListene i m p l e m e n t s PropertyChangeListener , Serializable
{ {
changes . addPropertyChangeLi ste ner ( l ); ......
} p u b l i c v o i d propertyChange ( PropertyChangeEvent e )
p u b l i c v o i d removePropertyListener ( ....
PropertyChangeListener l ) { }
changes . removePropertyCha ng eLi st ene r (l ); ...
} }
p u b l i c v o i d setForme ( i n t newForme )
{
i n t oldForme = newForme ;
forme = newForme ;
changes . firePropertyChange ( " forme " , oldForme , newForm
}
...
}

V. Granet U.N.S.A. Le langage Java 118 V. Granet U.N.S.A. Le langage Java 119
Part 14: Beans Part 14: Beans

Beans (11/13) Beans (12/13)

Une propriete peut etre aussi contrainte :


elle envoie un PropertyChangeEvent juste i m p o r t java . beans .*;
avant quelle ne change. Mais dautres public c l a s s FirstBean e x t e n d s Canvas
composants peuvent soppser a ce i m p l e m e n t s Serializable {
p r i v a t e VetoableChangeSupport veto
changement VetoableChangeListener. = new VetoableChangeSupport ( t h i s )
Les methodes setXX doivent gerer p u b l i c v o i d addVetoableChangeLis ten er (
lexception PropertyVetoException. VetoableChangeListener l ) {
changes . addVetoableChangeLi ste ner ( l );
}
p u b l i c v o i d removeVetoableCha nge Li ste ne r (
PropertyChangeListener l ) {
changes . removeVetoableCha ng eLi st ene r (l );
}
p u b l i c v o i d setForme ( i n t newForme )
t h r o w s PropertyVetoException {
i n t oldForme = newForme ;
veto . fireVetoableChange (" forme " , oldForme , newForme );
forme = newForme ;
changes . firePropertyChange ( " forme " , oldForme , newForm
}
...
}

V. Granet U.N.S.A. Le langage Java 120 V. Granet U.N.S.A. Le langage Java 121

Part 14: Beans

Beans (13/13)

Le bean qui emet le veto

public c l a s s BeanAudit
i m p l e m e n t s VetoableChangeListener , Serializable
{
......
p u b l i c v o i d vetoableChange ( PropertyChangeEvent e )
t h r o w s PropertyVetoException {
....
}
}
Threads

V. Granet U.N.S.A. Le langage Java 122 V. Granet U.N.S.A. Le langage Java 123
Part 15: Threads Part 15: Threads

Introduction La classe Thread

processus = programme en cours


dexecution c l a s s MonThread e x t e n d s Thread {
execution (quasi) parallele des processus // constructeur
p u b l i c MonThread () { ... }
processus leger (thread) // code a executer par le thread
la classe Thread (java.lang) p u b l i c v o i d run () { ... }
la methode run }
/* *
un thread pour main * Classe de Test qui cree et execute 2 threads
application terminee lorsque tous les */

threads sont finis public c l a s s TestThread {


public static v o i d main ( String [] arg ) {
priorite (getPriority() et setPriority(p)) MonThread threadA = new MonThread () ,
threadB = new MonThread ();
threadA . start () // et non pas run()
threadB . start ();
}
}

V. Granet U.N.S.A. Le langage Java 124 V. Granet U.N.S.A. Le langage Java 125

Part 15: Threads Part 15: Threads

Linterface Runnable (1/2) Linterface Runnable (2/2)

pas dheritage multiple


interface fonctionnelle Runnable public c l a s s Aleatoire i m p l e m e n t s Runnable {
Thread t1 = new Thread(t2) p u b l i c Thread proc = new Thread ( t h i s );
p r i v a t e Random rand ;
p r i v a t e l o n g intervalle ;
c l a s s MonThread i m p l e m e n t s Runnable { p u b l i c Aleatoire ( l o n g germe , l o n g time ) {
p u b l i c MonThread () { ... } rand = new Random ( germe );
p u b l i c v o i d run () { ... } intervalle = time * 1000;
} }
.... p u b l i c v o i d run () {
MonThread tA = new MonThread (); while ( true ) {
MonThread tB = new MonThread (); t r y { Thread . sleep ( intervalle ); }
new Thread ( tA ). start (); c a t c h ( InterruptedException e ) {}
new Thread ( tB ). start (); System . out . print ( rand . nextInt () + " " );
System . out . flush ();
}
}
} // fin classe Aleatoire

Runnable r = () -> System . out . println ( " 1 " );


new Thread ( r ). start ();
// ci-dessous le type Runnable est determine par inference
new Thread (() -> System . out . println ( " 2 " )). start ();

V. Granet U.N.S.A. Le langage Java 126 V. Granet U.N.S.A. Le langage Java 127
Part 15: Threads Part 15: Threads

Linterface Runnable (2/2) Etats dun threads

BLOCKED thread en attente de la liberation dune


donnee.
public c l a s s TestProd {
NEW thread qui na pas encore commence a
public static v o i d main ( String [] args ) {
sexecuter.
new Aleatoire (10 , 1). proc . start ();
new Aleatoire (15 , 3). proc . start (); RUNNABLE thread executable, pret a disposer de la
new Aleatoire (13 , 3). proc . start (); puissance de calcul.
} TERMINATED thread dont lexecution est terminee.
}
TIMED WAITING thread en attente avec une duree maxi-
mum specifiee.
WAITING thread en attente.

new Thread()

NEW TERMINATED
yield()
start() fin de run()
RUNNABLE

sleep(dure) IO? wait() notify()


fin dure IO ok
TIMED_WAITING BLOCKED WAITING

V. Granet U.N.S.A. Le langage Java 128 V. Granet U.N.S.A. Le langage Java 129

Part 15: Threads Part 15: Threads

Interruption dun processus (1/2) Interruption dun processus (2/2)

methode interrupt()
le processus peut verifier sil est public c l a s s TestProd {
interrompu ou non (il gere linterruption) public static v o i d main ( String [] args ) {
new Aleatoire (10 , 1). proc . start ();
new Aleatoire (15 , 3). proc . start ();
Aleatoire p = new Aleatoire (13 , 1);
p u b l i c v o i d run () {
p . proc . start ();
w h i l e (! Thread . interrupted ()) {
...
try {
// arr^
et du 3eme thread
Thread . sleep ( intervalle );
p . proc . interrupt ();
}
}
c a t c h ( InterruptedException e ) {
}
// interruption lors du sleep
break ;
}
System . out . print ( rand . nextInt () + " " );
System . out . flush ();
}
} interruption dans le sleep exception
hors du sleep drapeau
Thread.interrupted()
getPriority() et setPriority(int)

V. Granet U.N.S.A. Le langage Java 130 V. Granet U.N.S.A. Le langage Java 131
Part 15: Threads Part 15: Threads

Attente de la fin dun thread Gestion des threads (1/2)

methodes join() ou join(long ms) (pour static Thread currentThread()


les timeout) Retourne une reference sur le thread
actif.
static void dumpStack()
public static v o i d main ( String [] args ) { Affiche une trace de la pile dexecution
Aleatoire p1 = new Aleatoire (10 , 1); du thread courant.
Aleatoire p2 = new Aleatoire (15 , 2);
String getName()
Aleatoire p3 = new Aleatoire (13 , 1);
Retourne le nom du thread.
p1 . proc . start (); int getPriority()
p2 . proc . start ();
Retourne la priorite du thread.
p3 . proc . start ();
try { Thread.State getState()
p1 . proc . join (); // attendre la fin de p1 Retourne letat courant du thread.
p2 . proc . join (); // attendre la fin de p2
static boolean interrupted()
p3 . proc . join (); // attendre la fin de p3
Retourne true si le thread est inter-
}
c a t c h ( InterruptedException e ) {} rompu.
... boolean isAlive()
} Teste si le thread est actif.
void setName(String name)
Change le nom du thread.
void setPriority(int newPriority)
Change la priorite du thread.

V. Granet U.N.S.A. Le langage Java 132 V. Granet U.N.S.A. Le langage Java 133

Part 15: Threads Part 15: Threads

Gestion des threads (2/3) Gestion des threads (3/3)

void interrupt() static void sleep(long millis) ou sleep(long millis, int


Interrompt le thread. nanos)

void join() ou join(long millis) ou join(long Provoque lendormissement du thread pour


millis, int nanos) une duree egale au nombre de millise-
condes auquel sajoutent les eventuelles nano-
Attend que le thread meurt, au plus le temps
secondes.
indique en millisecondes et nanosecondes si
ces parametres sont fournis. void start()

void notify() Provoque le demarrage du thread, la JVM ap-


pelle alors sa methode run .
Reveille le thread precedemment mis en at-
tente. void wait() ou wait(long timeout) ou wait(long
timeout, int nanos)
void run()
Met le thread en attente dun notify invoque
Cette methode par defaut ne fait rien. Si le
par un autre processus ou du depassement du
thread est issu dun objet de type Runnable,
temps passe en parametre.
cest la methode run de cet objet qui est
executee ou sinon sa redefinition eventuelle. void yield()
Force le scheduling, le thread cede sa place aux
autres processus eligibles.

V. Granet U.N.S.A. Le langage Java 134 V. Granet U.N.S.A. Le langage Java 135
Part 15: Threads Part 15: Threads

Synchronisation des threads (1/3) Synchronisation des threads (2/3)

pb de lacces a une ressource critique (i.e. synchronized (obj) enonce ;


compte bancaire) ainsi une methode qualifiee synchronised peut se
pose dun verrou recrire :
toutes les methodes qui modifient letat
...
dun dobjet partage doivent etre
v o i d u n e M e t h o d e A S y n c h r o n i s e r () {
declarees synchronized.
synchronized ( t h i s ) {
... //code du corps de la methode
c l a s s CompteBancaire { }
p r i v a t e d o u b l e solde ;
public synchronized }
v o i d operation ( d o u b l e somme ) ...
{
i f ( solde + somme <0)
System . err . println ( " retrait impossible " );
else
solde += somme ;
}
}

V. Granet U.N.S.A. Le langage Java 136 V. Granet U.N.S.A. Le langage Java 137

Part 15: Threads Part 15: Threads

Synchronisation des threads (3/3) Producteurs Consommateurs (1/2)

...
s y n c h r o n i z e d (...) { //debut du bloc contr^ole
... //actions diverses
//tests de verification des donnees File dattente
wait (); //les donnees ne sont pas pr^etes
//attente dun notify() transmis par ailleurs

//reveil et reprise du cours de lexecution


... //actions sur les donnees

//le besoin de verrouiller nest plus Producteurs Consommateurs


notify () //message de reveil des processus endormis
... //actions diverses
producteurs et consommateurs doivent se
} //fin du bloc synchroniser (file vide)
...

V. Granet U.N.S.A. Le langage Java 138 V. Granet U.N.S.A. Le langage Java 139
Part 15: Threads Part 15: Threads

Producteurs Consommateurs (2/2) Tubes (1/2)

Un tube est un canal bidirectionnel entre 2


i m p o r t java . util .*;
threads
Les threads peuvent ecrire et lire dans le
public c l a s s File <T > e x t e n d s Vector <T > { tube
p u b l i c s y n c h r o n i z e d v o i d enfiler ( T e ) {
addElement ( e );
notify ();
}

p u b l i c s y n c h r o n i z e d T defiler () { Thread1 Tread2


Tube
i f ( isEmpty ())
try {
wait ();
}
c a t c h ( InterruptedException e ) {
return n ul l ;
} La synchronisation
T e = elementAt (0); Producteur/Consommateur est geree par le
removeElementAt (0);
r e t u r n e; support dexecution
}
} // fin classe File

V. Granet U.N.S.A. Le langage Java 140 V. Granet U.N.S.A. Le langage Java 141

Part 15: Threads

Tubes (2/2)

PipedInputStream et PipedOutputStream
les tubes dentree et de sortie doivent etre
connectes :
a la creation, avec le constructeur

PipedInputStream pi = new PipedInputStream ();


PipedOutputStream po = n u l l ;
try {
po = new PipedOutputStream ( pi );
}
c a t c h ( IOException e ) { System . err . println ( e ); } Applet

avec la methode connect()

PipedInputStream pi = new PipedInputStream ();


PipedOutputStream po = new PipedOutputStream ();
try {
pi . connect ( po );
}
c a t c h ( IOException e ) { System . err . println ( e ); }

V. Granet U.N.S.A. Le langage Java 142 V. Granet U.N.S.A. Le langage Java 143
Part 16: Applet Part 16: Applet

Applet Exemple

applet = petite application graphique


necessite une autre application graphique i m p o r t java . awt .*;
(navigateurs, appletviewer) i m p o r t java . applet .*;
plugin (inclus dans la jre) public c l a s s HelloWorldApplet e x t e n d s Applet {
Font f ;
classe Applet p u b l i c v o i d init () {
f = new Font ( " Times " , Font . BOLD , 20);
lang.Object }
p u b l i c v o i d paint ( Graphics g ) {
awt.Component g . setFont ( f );
g . setColor ( Color . pink );
g . drawString ( " Hello World ! " , 5 , 25);
awt.Container }
} // fin classe HelloWorldApplet

awt.Panel

applet.Applet
<OBJECT code="HelloWorldApplet.class"
pas de methode main width=400 height=150>
pas de constructeur, mais init </OBJECT>
contexte execution HTML

V. Granet U.N.S.A. Le langage Java 144 V. Granet U.N.S.A. Le langage Java 145

Part 16: Applet Part 16: Applet

AppletContext AudioClip

Concept de contexte dexecution (document Concept de clip audio (necessite un dispositif de


HTML), information sur lenvironnement, et en reproduction sonore). Plusieurs clips peuvent etre
particulier sur les autres applets du document. interpretes en meme temps par mixage sur la
AppletContext Applet.getAppletContext() meme plate-forme.
AudioClip Applet.getAudioClip(URL url)
Applet AppletContext.getApplet(String name) charger le clip audio donne a lURL.
void AudioClip.loop(), interpretation
Enumeration<Applet> AppletContext.getApplets() indefinie de ce clip.
void AudioClip.play(), interpretation de ce
void AppletContext.showStatus(String status) clip, une seule fois depuis le debut.
void AudioClip.stop(), arret de
void AppletContext.showDocument(URL url) linterpretation de ce clip.

void AppletContext.showDocument(URL url, String
avec ou = \_self, \_parent, \_blank, name

V. Granet U.N.S.A. Le langage Java 146 V. Granet U.N.S.A. Le langage Java 147
Part 16: Applet Part 16: Applet

La classe Applet (AWT) Evenements


void init(), initialisation reaction aux evenements clic de souris
void start(), juste apres init(), ou
automatiquement a chaque reapparition a
lecran (changement de page Web ou i m p o r t java . awt . Event ;

de-iconification), pour signifier a cette applet


p u b l i c b o o l e a n mouseDown ( Event event , i n t x , i n t y )
quelle doit demarrer ou redemarrer sa // code traitement
veritable execution. ....
void stop(), arret de lapplet. return true ;
Automatiquement appele a chaque disparition }

de lapplet de lecran (changement de page


Web ou iconification) ou juste avant sa
destruction complete.
boolean isActive(), applet est active des le
debut de lexecution de sa methode start() et
cesse de letre des que lexecution de stop()
est terminee.
void resize(Dimension d),
void resize(int l, int h)
String getAppletInfo()
void showStatus(String m), affichage du
message m dans la zone detat de lapplet.

V. Granet U.N.S.A. Le langage Java 148 V. Granet U.N.S.A. Le langage Java 149

Part 16: Applet Part 16: Applet

Chargement de fichiers Composants Graphiques

images ou sons, relatifs a une URL (base du code Utilisation des CG dAWT (Buttons,
ou base du document) Checkboxes, Labels, Canvas, etc.)
URL getCodeBase(), adr reseau de lapplet les methodes de classe Container (par
(.class) heritage) permettent leur manipulation
URL getDocumentBase(), adr reseau du add, ajout dun composant
contexte de lapplet (.html) remove, suppression
AudioClip getAudioClip(URL u), le clip setLayout, definition de lagenceur
audio situe a ladr reseau u
AudioClip getAudioClip(URL u, String x),
Composants graphiques Swing
idem, mais le clip est recherche a ladresse x,
relativement a ladresse de base u.
classe JApplet
Image getImage(URL u), limage situee a ladr
reseau u. Chargement progressif lors de la
premiere demande daffichage dans le contexte
graphique courant, sauf si un controleur de
medias (java.awt.MediaTracker bloque lapplet
jusqua la fin du chargement).
Image getImage(URL u, String x), idem ,
limage est recherchee a ladresse x,
relativement a ladresse de base u.

Image image = getImage(getCodeBase(), "Fig/f.gif");

V. Granet U.N.S.A. Le langage Java 150 V. Granet U.N.S.A. Le langage Java 151
Part 16: Applet Part 16: Applet

Parametres dune applet (1/2) Parametres dune applet (2/2)

Dans la balise Applet du fichier html, on passe les


i m p o r t java . awt . event .*;
valeurs des parametres
i m p o r t java . net .*;
i m p o r t java . applet .*; <applet code="Bouton.class" width=400 height=150>
public c l a s s BoutonURL e x t e n d s Applet <PARAM NAME=Url VALUE="http://www.unice.fr">
i m p l e m e n t s ActionListener { </applet>
Button b ;
String url ;
p u b l i c v o i d init () { noms des parametres conventionnels
url = getParameter ( " URL " );
(SOURCE, xxxSOURCE, etc)
i f ( url == n u l l ) url = " Vide " ;
add ( b = new Button ( url )); les parametres sont des chanes de car,
b . addActionListener ( t h i s ); mais lapplet pourra interpreter des
}
entiers, des booleens, etc.
p u b l i c v o i d actionPerformed ( ActionEvent e ) {
i f ( e . getSource () == b ) description des parametres (peut etre
try { utilisee par le navigateur)
getAppletContext (). showDocument (
new URL ( b . getLabel ()) , " _blank " );
}
c a t c h ( MalformedURLException ex ) {}
}
} // fin BoutonURL

V. Granet U.N.S.A. Le langage Java 152 V. Granet U.N.S.A. Le langage Java 153

Part 16: Applet Part 16: Applet

Securite
p u b l i c String [][] getParameterInfo () {
String [][] info = {
Laction des applets est limitee. Chaque
// Parametre Type Description
{" Url " , " URL " , " page a afficher " } , navigateur possede un SecurityManager qui
}; assure le controle (SecurityException).
r e t u r n info ;
} Une applet ne peut :
utiliser que son propre code et lAPI des
paquetages java.*. Cest tout.
lire ou ecrire des fichiers de la machine
client. Fichiers cote serveur. Exception
pour les applets locales ou identifiees
(trusted, signature).
etablir des connexions reseaux, sauf avec la
machine dou il est issu. Le serveur peut
servir de passerelles entre plusieurs applets
sur des clients differents.
executer des programmes de la machine
client.
lire certaines proritetes systemes :
java.class.path, java.home, user.dir,
user.home, user.name

V. Granet U.N.S.A. Le langage Java 154 V. Granet U.N.S.A. Le langage Java 155
Part 16: Applet Part 16: Applet

Thread et Applet
System . getProperty ( " " os . name " ); // OK

graphique actif (animation)


initialisation de lapplet (init()
start())
terminaison (stop() finalize())

i m p o r t java . awt .*;


i m p o r t java . applet .*;
public c l a s s ThreadApplet
e x t e n d s Applet i m p l e m e n t s Runnable {
p r i v a t e Thread proc ;

p u b l i c v o i d init () {
// initialisation des attributs
}
p u b l i c v o i d start () {
i f ( proc == n u l l ) {
proc = new Thread ( t h i s );
proc . start ();
}
}

V. Granet U.N.S.A. Le langage Java 156 V. Granet U.N.S.A. Le langage Java 157

Part 16: Applet

p u b l i c v o i d stop () {
i f ( proc != n u l l ) {
proc . interrupt ();
proc = n u l l ;
}
}
p u b l i c v o i d run () {
w h i l e ( isActive ()) {
// attendre laps de temps
// calculer les changements
repaint ();
}
}
p u b l i c v o i d paint ( Graphics g ) {
// redessiner le motif
Animation
}
} // fin classe ThreadApplet

V. Granet U.N.S.A. Le langage Java 158 V. Granet U.N.S.A. Le langage Java 159
Part 17: Animation Part 17: Animation

Introduction 1 - ne pas effacer la fenetre

Pb reduction des clignotements lies au reaffichage repaint update paint

1. ne pas effacer la fenetre ;


p u b l i c v o i d update ( Graphics g ) {
2. redessinner le strict necessaire (detourage) ;
g. setColor ( getBackground ());
3. le double buffering. g. fillRect (0 , 0 , getsize (). width , getsize (). height );
g. setColor ( getForeground ());
paint ( g );
}

on reecrit update de la facon suivante :

p u b l i c v o i d update ( Graphics g ) {
paint ( g );
}

methode a utiliser lorsque les nouveaux


dessins doivent se superposer avec les
anciens

V. Granet U.N.S.A. Le langage Java 160 V. Granet U.N.S.A. Le langage Java 161

Part 17: Animation Part 17: Animation

2 - Detourage 3 - Double buffering (1/2)

Ne reafficher que ce qui est necessaire Principe : ecrire dans une image auxiliaire. Une
Definir une portion de la fenetre sur laquelle fois limage terminee, on laffiche dun coup sans
sappliquera le reaffichage. avoir a effacer limage reelle precedente

setClip(x, y, w, h) et clipRect(x, y, w, h)

Pour les animations, la portion doit se deplacer !


Image temp ; // Tampon pour image decran.
Pb : les appels a repaint peuvent etre tres Graphics gTemp ; // Contexte graphique associe.
rapides, et certains appels a update et paint
peuvent etre perdus !

dans init :
v o i d repeindre () {
// Relance le dessin de lecran et attend jusqua ce que la
// procedure "paint" ait effectivement ete executee.
paintOK = f a l s e ;
temp = createImage ( getSize (). width , getSize (). height );
repaint ();
gTemp = temp . getGraphics ();
w h i l e (! paintOK ) {
t r y { .... sleep ( time ); }
c a t c h ( InterruptedException e ) {}
}
} // fin repeindre

V. Granet U.N.S.A. Le langage Java 162 V. Granet U.N.S.A. Le langage Java 163
Part 17: Animation

3 - Double buffering (2/2)

La methode paint dessine dans le contexte gTemp


associe a limage tmp, et execute a la fin :

gTemp . drawRect (1 ,1 ,30 ,50);


...
// Afficher limage tampon sur le veritable ecran :
g . drawImage ( temp , 0 , 0 , t h i s );

g est connecte a lecran reel, temp est limage a Reseau


dessiner a partir des coordonnees (0,0). Le dernier
parametre supervise laffichage.

// suppression du clignotement
p u b l i c v o i d update ( Graphics g ) {
// effacer limage temp
gTemp . setColor ( getBackground ());
gTemp . fillRect (0 , 0 , getSize (). width , getSize (). heigh
gTemp . setColor ( getForeground ());
paint ( g );
}

V. Granet U.N.S.A. Le langage Java 164 V. Granet U.N.S.A. Le langage Java 165

Part 18: Reseau Part 18: Reseau

Connexion a des URL (1/3) Connexion a des URL (2/3)

paquetage java.net
classe java.net.url URL u =
URL (Uniform Ressource Locator) new URL ( " ftp :// vg : secret@taloa . unice . fr / in / f" );
URLConnection uc = u . openConnection ();
// indiquer lacces en ecriture
protocole ://[utilisateur@]h^
ote [:port ][/chemin /fichier ]
uc . setDoOutput ( t r u e );
// creer un flot de sortie
OutputStream os = uc . getOutputStream ();
FileInputStream is = new FileInputStream ( " f " );
URL(adr) // copie le fichier f.txt
URL(prot,host,file) i n t b;
getProtocol() w h i l e (( b = is . read ()) != -1)
os . write (( b y t e ) b );
getHost() // fin de fichier
getFile() is . close (); os . close ();

URLConnection openConnection()
setDoInput(), setDoOutput()

connect()
openStream() (pour la lecture)
getContent()

V. Granet U.N.S.A. Le langage Java 166 V. Granet U.N.S.A. Le langage Java 167
Part 18: Reseau Part 18: Reseau

Connexion a des URL (3/3) Socket

services (http, ftp, telnet, ...) sont associes


a des ports
i m p o r t java . net .*;
i m p o r t java . io .*; un port est une entree virtuelle de
public c l a s s AfficherUrl { lordinateur
public static v o i d main ( String [] args )
pour obtenir un service, il faut (host, port)
t h r o w s IOException {
try { dans un programme, on etablit une ligne
URL url = new URL ( args [0]); virtuelle entre les ports des ordinateurs a
// convertir lurl en InputStream
connecter grace a une socket.
InputStream in = url . openStream ();
i n t c; Ordinateur A Ordinateur B
System . out . println ( url . getHost ()+ " / " +
programme programme
url . getFile ());
w h i l e (( c = in . read ()) != -1)
System . out . print (( c h a r ) c ); socket
}
c a t c h ( MalformedURLException e ) { port
port
System . err . println (" Bad Url : " +
args [0]);
}
Internet
c a t c h ( UnknownHostException e ) {
System . err . println (" Bad Url : " + port = entier sur 16 bits. Ports jusqua
args [0]);
1024 reserves (http 80, telnet 23, ...), au
}
} dessus, libres
} // fin classe AfficherUrl un programme peut gerer plusieurs ports
et plusieurs sockets

V. Granet U.N.S.A. Le langage Java 168 V. Granet U.N.S.A. Le langage Java 169

Part 18: Reseau Part 18: Reseau

Modes de transmission Datagrammes (emission 1/2)

Communication par commutateurs : classe DatagramPacket definit les paquets a


1) Mode non connecte : transmettre
classe InetAddress definit les adresses
commutation par paquets independants,
Internet
chaque paquet possede les adresses de
depart et darrivee InetAddress adrSource = InetAddress.getLocalHost();
Internet UDP, datagrams InetAddress adrDest = InetAddress.getByName("djinn");

multicast
connexion non fiable, ordre non garanti Un paquet Datagram contient linformation a
transmettre :
2) Mode connecte :
circuit virtuel de commutation etabli au String msg = " blabla blabla " ;
prealable b y t e [] data = msg . getBytes ();
DatagramPacket paquet =
Internet TCP
new DatagramPacket ( data , data . length ,
connexion fiable, ordre garanti adrDest , port );

Pour envoyer le paquet, il faut une socket :

V. Granet U.N.S.A. Le langage Java 170 V. Granet U.N.S.A. Le langage Java 171
Part 18: Reseau Part 18: Reseau

Datagrammes (emission 2/2)


DatagramSocket socket = new DatagramSocket ();
socket . send ( paquet );

i m p o r t java . net .*; i m p o r t java . io .*;


public c l a s s Emetteur {
public static v o i d main ( String [] args )
t h r o w s IOException {
// adresse du destinataire
InetAddress adrDest =
InetAddress . getByName ( args [0]);
i n t portDest = Integer . parseInt ( args [1]);
// creation de la socket
DatagramSocket socket = new DatagramSocket ();
b y t e [] data ;
DatagramPacket paquet = n u l l ;
while ( true ) {
System . out . print ( " > " );
String msg = StdInput . readLine ();
i f ( msg == n u l l ) b r e a k ;
// convertir le message en tableau de bytes
data = msg . getBytes ();
// creer le paquet et lexpedier
paquet = new DatagramPacket ( data ,
data . length , adrDest , portDest );
socket . send ( paquet );
}
socket . close ();
}
}

V. Granet U.N.S.A. Le langage Java 172 V. Granet U.N.S.A. Le langage Java 173

Part 18: Reseau Part 18: Reseau

Datagrammes (reception 1/2) Datagrammes (reception 2/2)

Un paquet Datagram contenant linformation a


recevoir doit etre cree : i m p o r t java . net .*;
i m p o r t java . io .*;
public c l a s s Receveur {
b y t e [] data = new b y t e [512]; public static v o i d main ( String [] args )
DatagramPacket paquet = t h r o w s IOException {
new DatagramPacket ( data , data . length ); i n t port = Integer . parseInt ( args [0]);
// creation de la socket
DatagramSocket socket =
new DatagramSocket ( port );
Pour recevoir le paquet, il faut egalement une // tampon ou mettre le message recu
b y t e [] data = new b y t e [512];
socket avec le port : // creer un paquet de reception des messages
DatagramPacket paquet = new DatagramPacket (
data , data . length );
DatagramSocket socket = new DatagramSocket ( port ); while ( true ) {
socket . receive ( paquet ); // recevoir le prochain message
socket . receive ( paquet );
// afficher le message recu
System . out . print (" from " +
paquet . getAddress (). getHostName ());
String msg = new String ( paquet . getData () ,
0 , paquet . getLength ());
System . out . println ( " " + msg );
}
}
}

V. Granet U.N.S.A. Le langage Java 174 V. Granet U.N.S.A. Le langage Java 175
Part 18: Reseau Part 18: Reseau

Datagrammes Datagrammes - Multicast

Sur lordinateur emetteur, lyre : Pour envoyer un message a un groupe de


machines destinatrices
lyre $ javac Emetteur.java MulticastSocket
lyre $ java Emetteur djinn 17000
les paquets sont envoyes a une adresse
> blabla blabla
multicast : 224.0.0.1 239.255.255.255 a
> abracadabra
laquelle doit se joindre tous les
>
destinataires

Sur lordinateur recepteur, djinn :


MulticastSocket mcs = new MulticastSocket ( port );
djinn $ javac Receveur.java InetAddress mcsAdr =
djinn $ java Receveur 17000 InetAddress . getByName ( " 228.5.6.7 " );
mcs . joinGroup ( mcsAdr );
from lyre.esinsa.unice.fr blabla blabla
from lyre.esinsa.unice.fr abracadabra

Les datagrammes sont ensuite


normalement expedies ou recus avec les
methodes send et receive precedentes
quitter le groupe :
mcs.leaveGroup(mcsAdr);
exemple dutilisation : programme chat

V. Granet U.N.S.A. Le langage Java 176 V. Granet U.N.S.A. Le langage Java 177

Part 18: Reseau Part 18: Reseau

Mode connecte TCP (emission 1/2) Mode connecte TCP (emission 2/2)

Un emetteur se connecte sur la machine


destinatrice grace a une socket : i m p o r t java . net .*;
i m p o r t java . io .*;
public c l a s s Emetteur {
Socket socket = new Socket ( " djinn " , portDest ); public static v o i d main ( String [] args )
// ou bien t h r o w s IOException {
Socket socket = new Socket (); i n t portDest = Integer . parseInt ( args [1]);
// 1er port libre // creation du socket
socket . bind (new InetSocketAddress ( " localhost " ,0)); Socket socket = new Socket ();
socket . connect (new InetSocketAddress ( " djinn " , socket . bind (
portDest )); new InetSocketAddress (" localhost " , 0));
socket . connect (new InetSocketAddress (
args [0] , portDest ));
DataOutputStream out =
Un flot est cree entre les deux machines. new DataOutputStream (
socket . getOutputStream ());
while ( true ) {
System . out . print ( " > " );
DataOutputStream out =
String msg = StdInput . readLine ();
new DataOutputStream ( socket . getOutputStream ());
i f ( msg == n u l l ) b r e a k ;
DataInputStream in =
// ecrire le message
new DataInputStream ( socket . getInputStream ());
out . writeChars ( msg ); out . writeChar ( \ n );
}
out . close ();
socket . close ();
Lemetteur ecrit (ou lit) dans le fichier out (ou }
in). }

V. Granet U.N.S.A. Le langage Java 178 V. Granet U.N.S.A. Le langage Java 179
Part 18: Reseau Part 18: Reseau

Mode connecte TCP (reception 1/2) Mode connecte TCP (reception 1/2)

Le receveur doit creer une socket speciale,


ServerSocket en specifiant le numero de
i m p o r t java . net .*;
port i m p o r t java . io .*;
Il indique ensuite quil est pret a accepter public c l a s s Receveur {
public static v o i d main ( String [] args )
la connexion dun emetteur t h r o w s IOException {
i n t port = Integer . parseInt ( args [0]);
// creation de la socket serveur
ServerSocket socketServeur = ServerSocket socketServeur =
new ServerSocket ( port ); new ServerSocket ( port );
Socket socketEmetteur = socketServeur . accept (); // creation du socket de reception
Socket socket = socketServeur . accept ();
// creation du flot de communication
BufferedReader din =
new BufferedReader (
new InputStreamReader (
socket . getInputStream ()));
while ( true ) {
System . out . print ( " from " +
socket . getInetAddress (). getHostName ());
System . out . println ( " " + din . readLine ());
}
}
}

V. Granet U.N.S.A. Le langage Java 180 V. Granet U.N.S.A. Le langage Java 181

Part 18: Reseau Part 18: Reseau

Modele Client/Serveur (1/4)


Sur lordinateur emetteur, lyre :
Dans un modele client/serveur, le receveur est le
lyre $ javac Emetteur.java serveur qui peut accepter plusieurs connexions de
lyre $ java Emetteur djinn 17000 differents clients. Chaque client est traite par
> blabla blabla dans un thread.
> abracadabra
>
while ( true ) {
// attendre la prochaine connexion
Socket socketClient = socketServeur . accept ();
Sur lordinateur serveur, djinn :
new GestionDuClient ( socketClient ); // thread
}
djinn $ javac Receveur.java
djinn $ java Receveur 17000
Serveur actif sur le port 17000
from lyre.esinsa.unice.fr blabla blabla
from lyre.esinsa.unice.fr abracadabra

V. Granet U.N.S.A. Le langage Java 182 V. Granet U.N.S.A. Le langage Java 183
Part 18: Reseau Part 18: Reseau

Modele Client/Serveur (2/4) Modele Client/Serveur (3/4)

i m p o r t java . net .*; c l a s s GestionDuClient i m p l e m e n t s Runnable {


i m p o r t java . io .*; p u b l i c Thread proc = new Thread ( t h i s );
public c l a s s Serveur { p r i v a t e Socket socket ;
public static v o i d main ( String [] args ) p r i v a t e BufferedReader din ;
t h r o w s IOException { p u b l i c GestionDuClient ( Socket s )
i n t port = Integer . parseInt ( args [0]); t h r o w s IOException {
// creation de la socket socket = s ;
ServerSocket socketServeur = InputStreamReader in =
new ServerSocket ( port ); new InputStreamReader ( s . getInputStream ());
System . out . println (" Serveur actif " + din = new BufferedReader ( in );
" sur le port " + port ); proc . start ();
while ( true ) { }
// attendre la prochaine connexion p u b l i c v o i d run () {
Socket socketClient = while ( true )
socketServeur . accept (); try {
System . out . println ( // creer un paquet de reception des messages
socketClient . getInetAddress (). System . out . print ( " from " + socket .
getHostName () + " connecte " ); getInetAddress (). getHostName ());
// gerer le client dans un thread System . out . println ( " " + din . readLine ());
new GestionDuClient ( socketClient ); }
} c a t c h ( IOException e ) { b r e a k ; }
} System . out . println ( socket . getInetAddress ().
} getHostName () + " deconnecte " );
t r y { socket . close ();}
c a t c h ( IOException e ) {}
}
}

V. Granet U.N.S.A. Le langage Java 184 V. Granet U.N.S.A. Le langage Java 185

Part 18: Reseau Part 18: Reseau

Modele Client/Serveur (4/4) djinn $ javac Serveur.java


djinn $ java Serveur 17000
Sur les ordinateurs clients Serveur actif sur le port 17000
mondrian.esinsa.unice.fr connecte
lyre $ javac Emetteur.java lyre.esinsa.unice.fr connecte
lyre $ java Emetteur djinn 17000 from lyre.esinsa.unice.fr blabla blabla
> blabla blabla from mondrian.esinsa.unice.fr hello ...
> abracadabra from lyre.esinsa.unice.fr abracadabra
>

mondrian $ javac Emetteur.java


mondrian $ java Emetteur djinn 17000
> hello ...
>

Sur lordinateur serveur, djinn :

V. Granet U.N.S.A. Le langage Java 186 V. Granet U.N.S.A. Le langage Java 187
Part 19: Jni

Jni (1/6)

Jni (Java Native Interface) permet dexecuter du


code C, C++, ... dans une application Java
Interet :
reutilisation de code existant
(bibliotheque)
code particulier en assembleur
...
Jni permet une communication bidirectionnelle
Jni entre entre les deux formes de code (Java et C par
exemple).

V. Granet U.N.S.A. Le langage Java 188 V. Granet U.N.S.A. Le langage Java 189

Part 19: Jni Part 19: Jni

Jni (2/6) Jni (3/6)

Exemple : lincontournable HelloWorld Creation du .h associe a la classe HelloWorld

javah HelloWorld
c l a s s HelloWorld {
p u b l i c n a t i v e v o i d displayHelloWorld ();
Le fichier donne le prototype de la fonction C qui
static {
// le code C est dans la bibliotheque hello assure linterface avec Java. Nom conventionnel
System . loadLibrary ( " hello " );
} Java_Nom de la classe _Nom de la methode
public static v o i d main ( String [] args ) {
new HelloWorld (). displayHelloWorld ();
Java_HelloWorld_displayHelloWorld
}
}

On compile

javac HelloWorld.java

V. Granet U.N.S.A. Le langage Java 190 V. Granet U.N.S.A. Le langage Java 191
Part 19: Jni Part 19: Jni

Jni (4/6) Jni (5/6)

Le fichier C :
/* DO NOT EDIT THIS FILE - it is machine generated */
#i n c l u d e < jni .h >
#i n c l u d e < jni .h >
/* Header for class HelloWorld */
#i n c l u d e " HelloWorld . h "
#i f n d e f _Included_HelloWorld
#i n c l u d e < stdio .h >
#d e f i n e _Included_HelloWorld
JNIEXPORT v o i d JNICALL
#i f d e f __cplusplus
Java_HelloWorl d_ di spl ay He ll oW or ld ( JNIEnv * env , jobject o
e x t e r n " C" {
{
#e n d i f
printf (" Hello world !\ n " );
/*
return ;
* Class : HelloWorld
}
* Method : displayHelloW or ld
* Signature : () V
*/
JNIEXPORT v o i d JNICALL Java_HelloWorld _d isp la yH el lo Wo rl
( JNIEnv * , jobject ); Creation de la bibliotheque libhello (Linux)

#i f d e f __cplusplus gcc -shared -I${JAVA_HOME}/include \


}
-I${JAVA_HOME}/include/linux HelloWorld.c -o libhello.so
#e n d i f
#e n d i f
Execution de lapplication Java

LD_LIBRARY_PATH=. java HelloWorld


Hello world!

V. Granet U.N.S.A. Le langage Java 192 V. Granet U.N.S.A. Le langage Java 193

Part 19: Jni

Jni (6/6)

Jni permet egalement lacces a Java depuis le


code natif (C, C++).
Linterface JNI offre :
des definitions dequivalence de type
(jboolean, jint, jdouble, jstring, jarray,
jclass, etc.)
des fonctions de manipulation de ces types
par lintermediaire de (JNIEnv *env)
lacces aux attributs et aux methodes Jdk 1.5
dobjets Java

V. Granet U.N.S.A. Le langage Java 194 V. Granet U.N.S.A. Le langage Java 195
Part 20: Jdk 1.5 Part 20: Jdk 1.5

Nouveautes Tiger Autoboxing

La version 1.5 (Tiger) apporte des changements Les conversions explicites entre les types
importants au langage : elementaires et leurs equivalents objet nest
Autoboxing plus necessaire :
Importation static
Enonce foreach Character c = a ;
Enumerations i n t i = new Integer (10);

Genericite
Hashtable ht = new Hashtable ();

ht . put ( " Paul " , 3);


ht . put ( " Pierre " , 19);
Integer n = ( Integer ) ht . get (" Pierre " );

i f ( n != n u l l )
System . out . println (" Pierre = " + n );

V. Granet U.N.S.A. Le langage Java 196 V. Granet U.N.S.A. Le langage Java 197

Part 20: Jdk 1.5 Part 20: Jdk 1.5

Importation static Enonce foreach (1/2)

Specialisation de la directive import pour lacces Forme generalisee de lenonce pour lorsquil sagit
non qualifie aux objets declares static dune dappliquer un meme traitement a tous les
classe elements dun tableau ou dune collection :
ecriture plus naturelle et plus sure
i1 = Math . sqrt ( -)/(2* a );

i n t [] tab ;
....
on pourra ecrire : i n t somme = 0;
f o r ( i n t i =0; i < tab . length ; i ++)
somme += tab [i ];

i m p o r t s t a t i c java . lang . Math .*;


...
i1 = sqrt ( -)/(2* a );

i n t [] tab ;
....
i n t somme = 0;
f o r ( i n t x : tab )
somme += x ;

V. Granet U.N.S.A. Le langage Java 198 V. Granet U.N.S.A. Le langage Java 199
Part 20: Jdk 1.5 Part 20: Jdk 1.5

Enonce foreach (2/2) Enumeration (1/2)

Enumeration de constantes representees par des


Vector v = new Vector ();
noms (comme en C)
v . addElement (13); v . addElement (128); ....
i n t somPairs = 0;
f o r ( Iterator i = v. iterator (); i . hasNext (); ) { enum Couleur { trefle , carreau , coeur , pique }
Integer x = ( Integer ) i . next (); enum Valeur { deux , trois , quatre , cinq , six , sept ,
i f ( x % 2 == 0) somPairs += x ; huit , neuf , dix , valet , dame , roi , as }
}
c l a s s Carte {
Couleur couleur ;
Valeur valeur ;
Carte ( Valeur v , Couleur c ) {
valeur = v ;
Vector v = new Vector (); couleur = c ;
v . addElement (13); v . addElement (128); .... }
i n t somPairs = 0; }
f o r ( Object x : v )
i f (( Integer ) x % 2 == 0) somPairs += ( Integer ) x ; ...
new Carte ( Valeur . as , Couleur . coeur );
...

V. Granet U.N.S.A. Le langage Java 200 V. Granet U.N.S.A. Le langage Java 201

Part 20: Jdk 1.5 Part 20: Jdk 1.5

Enumeration (2/2)
enum Valeur {
deux (2) , trois (3) , quatre (4) , cinq (5) ,
les enumerations sont des objets six (6) , sept (7) , huit (8) , neuf (9) , dix (10) ,
methode predefinie values() valet (10) , dame (10) , roi (10) , as (20);

on peut ajouter des attributs et des


i n t valeur ;
methodes Valeur ( i n t v) { valeur = v ; }
i n t valeur () { r e t u r n valeur ; }
} // fin enum
// fabrication dun jeu de 52 cartes
Carte [] jeu52 = new Carte [52]; System . out . println ( Valeur . as ); // as
i n t i = 0; System . out . println ( Valeur . as . valeur ()); // 20
f o r ( Couleur c : Couleur . values ())
f o r ( Valeur v : Valeur . values ())
jeu52 [ i ++] = new Carte (v , c );

V. Granet U.N.S.A. Le langage Java 202 V. Granet U.N.S.A. Le langage Java 203
Part 20: Jdk 1.5 Part 20: Jdk 1.5

Genericite (1/5) Genericite (2/5)

Permet de parametrer le type des


structures de donnees
c l a s s Noeud <T > {
evite les conversions explicites de type dues T val ;
a Object Noeud <T > suivant ;
Noeud ( T v ) { val = v; }
assure les controles de type
}

c l a s s Pile <E > {


Hashtable < String , Integer > ht = Noeud <E > sommet ;
new Hashtable < String , Integer >(); v o i d empiler ( E x ) {
ht . put ( " Paul " , 3); // ajouter en t^
ete lelement x
ht . put ( " Pierre " , 19); Noeud <E > p = new Noeud <E >( x );
Integer n = ht . get ( " Pierre " ); // pas de conver. explicite p . suivant = sommet ;
i f ( n != n u l l ) sommet = p ;
System . out . println (" Pierre = " + n ); }
E sommet () {
Vector < Integer > v = new Vector < Integer >(); // retourner la valeur du sommet de pile
r e t u r n sommet . val ;
v . addElement ( " toto " ); // ! erreur compilation }
}
v . addElement (13); v . addElement (128); ...
i n t somPairs = 0;
f o r ( Integer x : v )
// pas de conversion explicite
i f (x % 2 == 0) somPairs += x ;

V. Granet U.N.S.A. Le langage Java 204 V. Granet U.N.S.A. Le langage Java 205

Part 20: Jdk 1.5 Part 20: Jdk 1.5

Genericite (3/5) Genericite (4/5)

// Definition simplifiee dune Pile generique // une pile de cha^


nes
c l a s s Pile <T > { Pile < String > p1 = new Pile < String >();
private final i n t N = 100; // une pile de piles dentiers
private i n t sommet = 0; Pile < Pile < Integer > > p2 =
// pas de genericite sur les tableaux ! new Pile < Pile < Integer > >();
p r i v a t e T [] elements = ( T []) new Object [ N ];

p u b l i c v o i d empiler ( T x ) {
elements [ sommet ++] = x ;
Mais aussi, sans genericite
}

p u b l i c v o i d depiler () { Pile p = new Pile();


sommet - -; p.empiler("bonjour");
} p.empiler(6); // OK
p u b l i c T sommet () {
// la conversion suivante est obligatoire
r e t u r n elements [ sommet -1];
} Integer i = (Integer) p.sommet();
}

mais alors, message du compilateur

Note: Test.java uses unchecked or unsafe operations.


Note: Recompile with -Xlint:unchecked for details.

V. Granet U.N.S.A. Le langage Java 206 V. Granet U.N.S.A. Le langage Java 207
Part 20: Jdk 1.5 Part 20: Jdk 1.5

Genericite (5/5) Genericite et Polymorphisme (1/2)

Genericite sur plusieurs types :

Pile < Integer > p1 = new Pile < Integer >();


c l a s s Noeud <C ,V > { Pile < Object > p2 = p1 ;
C cle ;
V val ;
Noeud <C ,V > suivant ;
Noeud ( C c , V v ) { cle = c ; val = v; }
Illegal : car on pourrait empiler autre chose que
}
des Integer !
De meme :
et avec les interfaces :
v o i d afficherSommet ( Pile < Object > p ) {
System . out . println ( p. sommet ());
i n t e r f a c e Pile <T > { v o i d empiler ( T x ); }
} ...
Pile < Integer > p = new Pile < Integer >();
// Implementation dune pile par un tableau
afficherSommet ( p ); // types incompatibles
c l a s s PileTableau <E > i m p l e m e n t s Pile <E > { ... }
// idem avec une structure cha^
nee
c l a s s PileCha^
nee <E > i m p l e m e n t s Pile <E > { ... }
...
Pile < String > p = new PileCha^
nee < String >();

Notez le meme nom E

V. Granet U.N.S.A. Le langage Java 208 V. Granet U.N.S.A. Le langage Java 209

Part 20: Jdk 1.5 Part 20: Jdk 1.5

Genericite et Polymorphisme (2/2) Methodes generiques

Solution : la notation ?
v o i d dupliquerSommet ( Pile <? > p) {
Object o = p . sommet (); // OK
v o i d afficherSommet ( Pile <? > p ) {...} p . empiler ( o ); // erreur de compilation
... // car le type des elements est inconnu
Pile < Integer > pi = new Pile < Integer >(); }
afficherSommet ( pi ); // OK
Pile < String > ps = new Pile < String >();
afficherSommet ( ps ); // OK

Solution : methodes generiques

pour limiter le polymorphisme aux <T > v o i d dupliquerSommet ( Pile <T > p ) {
sous-classes de A T o = p . sommet ();
p . empiler ( o );
}
v o i d afficherSommet ( Pile <? e x t e n d s A > p) {...}

? super A pour limiter le polymorphisme Pile < Integer > p1 = new Pile < Integer >();
aux super-classes de A Pile < String > p2 = new Pile < String >();
dupliquerSommet ( p1 );
dupliquerSommet ( p2 );

V. Granet U.N.S.A. Le langage Java 210 V. Granet U.N.S.A. Le langage Java 211
Part 21: Jdbc

JDBC (1/8)

Java Database Connectivity


offre la connexion dapplications Java avec
differents types de BD (SQL, tableurs, etc.)
API JDBC est independante du SGBD.
Ensemble de classes (java.sql.*)

client client

Jdbc midleware

serveur BD
serveur BD

Modele 2 couches Modele 3 couches

V. Granet U.N.S.A. Le langage Java 212 V. Granet U.N.S.A. Le langage Java 213

Part 21: Jdbc Part 21: Jdbc

JDBC (2/8) JDBC (3/8)

Lacces a la BD se fait par lintermediaire dun import java.sql.*


pilote. JDBC gere :
la connexion a la BD
1. un pont entre JDBC et ODBC (Microsoft). lenvoi de requetes SQL
La communication se fait via des fonctions lexploitation des resultats provenant
C appelees par les methodes du pilote ; de la BD
2. les pilotes recourant a des fonctions
non-Java specifiques du SGBD ;
3. les pilotes permettent lemploi dun serveur
middleware. Il sagit dune interface avec le
SGBD via une API specifique ;
4. les pilotes Java proprietaires utilisant
directement le protocole reseau du SGBD
(e.g. mysql-connector).

V. Granet U.N.S.A. Le langage Java 214 V. Granet U.N.S.A. Le langage Java 215
Part 21: Jdbc Part 21: Jdbc

JDBC - Connexion (4/8) JDBC - Statement (5/8)

DriverManager : Envoi de requetes SQL (Statement


gere les pilotes charges (ici pour mysql) : createStatement pour une requete SQL
simple (sans parametre)
prepareStatement pour une requete SQL
try {
// creer une nouvelle instance du Driver
(precompilee) avec parametres
Class . forName ( prepareCall pour lappel dune procedure
" com . mysql . jdbc . Driver " ). newInstance (); preparee.
}
c a t c h ( Exception ex ) { /* gerer les erreurs */ }
ResultSet executeQuery(),
int executeUpdate()

cree les connexions (Connection) : // creer un Statement


Statement stmt = conn . createStatement ();
// executer une requ^
ete SQL
ResultSet rs = stmt . executeQuery (
String urlBD = " jdbc : mysql :// localhost / bd " ;
" SELECT * FROM uneTable ; " );
t r y ( Connection conn =
DriverManager . getConnection ( urlBD , " user " ," pass " );
)
{
// code de lapplication qui accede a la BD
...
} c a t c h ( Exception ex ) { /* gerer les erreurs */ }

V. Granet U.N.S.A. Le langage Java 216 V. Granet U.N.S.A. Le langage Java 217

Part 21: Jdbc Part 21: Jdbc

JDBC - ResultSet (6/8) JDBC - prepareStatement (7/8)

ResultSet resultat dune requete SQL (i.e. requete precompilee (plus efficace)
lignes de la table) parametres
methodes get pour acceder aux colonnes
de la ligne courante
// INSERT INTO animal VALUES
next() pour passer le curseur a la ligne // -> (Coco,Diane,Perroquet,f,2000-06-09,NULL);
suivante
previous() PreparedStatement pstmt =
conn . prepareStatement (
conversion de types entre SQL et Java " INSERT INTO animal VALUES (? ,? ,? ,? ,? , NULL ); " );
(getString, getInt, getDate, ...)
// definir les parametres

pstmt . setString (1 , " Coco " );


rs . absolute (2);
pstmt . setString (2 , " Diane " );
System . out . println ( " Resultat : " + rs . getInt (1));

// executer la requ^
ete
rs . beforeFirst ();
pstmt . executeUpdate ();
w h i l e ( rs . next ()) {
String nom = rs . getString ( " nom " );
String espece = rs . getString ( " espece " );
Date naissance = rs . getDate (" naissance " );
System . out . println ( nom + " " + espece +
" " + naissance );
}

V. Granet U.N.S.A. Le langage Java 218 V. Granet U.N.S.A. Le langage Java 219
Part 21: Jdbc

JDBC - callStatement (8/8)

requete precompilee pour appeler une


fonction de la BD
parametres

CallableStatement cstmt =
conn . prepareCall ( " call myfunc (? ,?); " );
// fixer la valeur du 1er parametre donnee ( e.g. un reel)
cstmt . setFloat (1 , 34.5 f );
// le 2eme parametre est un resultat ( e.g. une cha^
ne)
cstmt . registerOutParameter (2 , Types . VARCHAR );
// executer la requ^
ete
cstmt . execute ();
// afficher le le resultat
System . out . println ( cstm . getString (2));

V. Granet U.N.S.A. Le langage Java 220

Vous aimerez peut-être aussi