Vous êtes sur la page 1sur 39

POLYCOPIE SUR LE LANGAGE JAVA CHAPITRE 1 : GENERALITES 1 Quest-ce que Java ?

Le langage Java a t introduit par la socit SUN en 1995. Il possde de nombreuses caractristiques : Cest un langage orient objet Cest un langage compil : avant dtre excut, il doit tre traduit dans le langage de la machine sur laquelle il doit fonctionner Il emprunte sa syntaxe en grande partie du langage C Les programme Java peuvent tre excuts sous forme dapplications indpendantes ou distribues travers le rseau et excutes par un navigateur Internet sous forme dapplets. Pourquoi utiliser Java ?

2.1 Le monde sans Java Avec les langages volus courant (C++, C, etc.) nous avons pris lhabitude de coder sur une machine identique celle qui excutera nos applications ; la raison est fort simple : de rares exceptions prs les compilateurs ne sont pas multi-plateformes et le code gnr est spcifique la machine qui doit accueillir. Nous devons alors utiliser n compilateurs diffrents sur n machines. Aujourdhui, la gnralisation des interfaces graphiques et lusage de langage plus volus compliquent encore davantage le problme. Ainsi pour dvelopper une application destines plusieurs systmes dexploitation avec ses diffrentes couches de librairies et dinterfaces ; les API de ces interfaces tant toutes diffrentes. Ainsi nos applications sont fortement dpendantes des ressources (y compris graphique) du systme hte, dpendantes des API des interfaces utilises, et le code produit ne peut sexcuter que sur le systme pour lequel il a t initialement produit. 2.2 Le monde avec Java Tout dabord, Java simplifie le processus de dveloppement : quelle que soit la machine sur laquelle on code, le compilateur fournit le mme code. Ensuite, quel que soit le systme utilis cet unique code est directement oprationnel: En effet, la compilation dun source Java produit du pseudo-code (byte code) Java qui sera excut par tout interprteur Java sans aucune modification ou recompilation. Cet interprteur est couramment dnomm machine virtuelle Java . 3 Utilisation du JDK (Kit de dveloppement Java)

Permet le dveloppement de programmes en Java. Il est constitu de plusieurs outils tel que : javac.exe : compilateur java.exe : interprteur
1

- jdb.exe : debugger et dune importante librairies de classe (API). Tlchargement : http://www.sun.com/products/index.html Configuration : Chemin daccs aux excutables En supposant que vous avez choisi la version windows 98. Vous devez modifier la variable PATH du fichier autoexec.bat : Ouvrez laide dun diteur de texte, le fichier autoexec.bat se trouvant dans la racine du disque dur Localisez la ligne commenant par set path et ajoutez la fin de celle-ci : set path = c:\jdk1.2\bin

La variable denvironnement path indique Windows le chemin daccs quil doit utiliser pour trouver les programmes excutables. Windows cherche les programmes excutables tout dabord dans le dossier partir duquel la commande est tape, puis dans les dossiers dont les chemins daccs sont indiqus par la variable path . Chemin daccs aux classes Java Le chemin daccs aux classes Java peut tre configur exactement de la mme faon laide de la variable classpath. 4 Syntaxe du langage Java

4.1 Type de variables En Java on dispose des mmes types quen langage C (int, float, char). On dispose den plus du type boolean (1 bit). Ce type a deux valeurs possibles false et true (initialisation false). 4.2 Oprateurs Oprateurs arithmtiques + * / % ++ --

Oprateurs daffectation = += -= *= /=

Oprateurs de comparaison < > <= >=

Oprateurs logiques ! && ||

4.3 Structures de contrle et dbranchements Boucles rptitives while dowhile for

Instructions pour faire des choix ifelse switchcase

5 Principe de la programmation en Java : lorient objet Un programme structur (Pascal, C) est compos de fonctions indpendantes constitues dinstructions simples et structurs. Ainsi, les donnes et les fonctions qui oprent sur elles sont spares. Les donnes apparaissent gnralement en tte du programme et sont donc visibles de toutes les fonctions qui suivent. Cette organisation pose le grave problme des effets de bord. En entrant dans une fonction, on est jamais assur de trouver les donnes dans ltat attendu, car nimporte quelle autre fonction, mme si ce nest pas son rle, peut les modifier. De plus, cause de cette sparation entre donnes et fonctions, de profonds bouleversements du programme sont ncessaires quand les structures de donnes sont modifies. La solution ces problmes est la programmation objet. Elle est base sur trois principes fondamentaux : lencapsulation, lhritage, et le polymorphisme. 5.1 Lencapsulation Lencapsulation des donnes est le premier et le plus important des concepts de la programmation objet. Il stipule que les donnes et les fonctions qui oprent sur elles sont encapsules dans des objets. Les seules fonctions a tre autorises modifier les donnes dun objet sont les fonctions appartenant cet objet. Depuis lextrieur dun objet, on ne peut le modifier que par des fonctions faisant office dinterface. Ainsi, il nest plus craindre que des fonctions modifient indment des donnes. 5.2 Lhritage Les objets, comme les donnes, possdent un type que lon appelle classe. Les classes peuvent tre organises en hirarchies, chaque classe hritant de sa classe mre ou super-classe. Lhritage est ainsi source dconomie de code, une classe peut tre dfinie comme la descendante dune classe (ou sous-classe). 5.3 Le polymorphisme Le troisime principe de base de la programmation objet est le polymorphisme. Il passe plus inaperu que les prcdentS. Des fonctions diffrentes dans les classes diffrentes peuvent

prendre le mme nom. Ainsi, dans une hirarchie de classes dlments graphiques la fonction dessiner( ) aura le mme nom pour un polygone ou un cercle, cependant les techniques utilises pour dessiner ces lments sont diffrentes. Le polymorphisme est beaucoup plus puissant quil ny parat premire vue. Il fait conomiser des identificateurs de fonctions et rend les notations plus lisibles.

CHAPITRE 2: DECOUVERTE DU LANGAGE 1 Dfinition dune classe et dun objet en Java La notion de classe est un enrichissement de la notion usuelle de structure en C (struct) en C. Une classe permet de dfinir un type dobjet, ventuellement compliqu, associant des donnes et des procdures qui accdent ces donnes. Les donnes se prsentent sous forme de champ dsigns par identificateurs et dots dun type. A une donne, on associe un mot cl qui dsigne laccessibilit de cette donne. Les procdures, galement appeles mthodes, dfinissent les oprations possibles sur ces composants. A une mthode, on associe un mot cl dsignant laccessibilit de cette mthode. Exemple class Point { private int _x; private int _y; public Point() { _x = 0 ; _y = 0 ; } public Point(int x, int y) { _x = x ; _y = y ; } public void avancer(int dx, int dy) { _x = _x + dx ; _y = _y + dy ; } } La classe Point possde deux attribut : _x, _y et trois mthodes Point(), Point(int, int), avancer(int, int). Le mot cl private indique que lattribut est priv il ne sera accessible que par les mthodes appartenant la classe. Un attribut public est accessible par une mthode appartenant une autre classe (voir aussi paragraphe 9). Remarque Le corps (contenu) des mthodes dune classe sera dfini dans la classe elle-mme.

Initialisation des objets : constructeur Une classe peut dfinir une ou plusieurs procdures dinitialisation appeles constructeurs. Un constructeur est une mthode avec aucune valeur de retour et qui porte le mme nom que la classe. Sil existe plusieurs mthodes dans une classe, elles se distinguent par le type ou le nombre de paramtres : Point( ) et Point(int, int) Le constructeur permet de crer une instance de la classe. Une instance de classe est dite objet. Pour crer un Point on va : 1. Dclarer un handle sur un Point. Point p ; (p est un handle sur un point). Remarque Un handle est un numro. Par exemple, quand une application alloue de la mmoire, le compilateur ne rend pas un pointeur mais un numro. Ce numro est associ une zone mmoire. 2. La dclaration seule ne cre pas dobjet. Elle associe lidentificateur une rfrence appele null qui ne fait rfrence rien. p null Pour crer une instance de la classe point (on dit objet de la classe Point), il faut excuter new en citant un constructeur de la classe Point, avec ses paramtres. La primitive new rend en rsultat la rfrence sur lobjet cre, quil suffit alors daffecter la variable dclare : new Point(2,0) Point p = new Point(2,0) ; destruction des objets: destructeur Avec Java, plus besoin d'crire une fonction destructeur. En effet, il existe un programme appel 'garbage collector' (ramasseur d'ordures) qui est excut automatiquement ds que la mmoire disponible devient infrieure un certain seuil.

2 Compilation et excution dun programme en java Pour compiler un programme en Java, il faut utiliser linstruction javac suivi du nom du fichier. Exemple Pour compiler la classe Point, on crit javac Point.java A la fin de la compilation si aucune erreur na t dtecte, le code de base est transform en byte code et un fichier Point.class est gnr. Cest ce fichier qui sera excut. Pour excuter un programme en Java, on utilise linstruction java suivi du nom de la classe. Exemple Pour excuter la classe Point, on crit java Point Remarque Quand on crit un programme en Java il faut viter de donner au fichier .java un nom diffrent de la classe. Par exemple, si pour on sauvegarder la classe Point nous choisissons le nom Toto.java la fin de la compilation le fichier Toto.class sera crer. Il y aura ensuite des erreurs au niveau de lexcution (en effet, la classe Toto nexiste pas). 3 Notion de primitives Souvent on dit que le langage Java est un langage tout objet (tout est instance d'une classe). En fait, ce n'est pas tout a fait vrai. Supposons qu'on aune boucle permettant d'incrmenter u entier 1000 fois, il ne serait pas judicieux de crer 1000 un objet pour l'utiliser comme incrment (il existe en Java la classe Integer qui pourrait tre utilise mais qui ralentirai normment le programme avec une cration de 1000 objets Integer). Les concepteurs de Java ont donc dot ce langage d'une srie d'lments particuliers appels primitives qui ne sont pas grs de la mme manire en mmoire (voir chapitre 1 du polycopie pour les diffrentes primitives existantes). Diffrence entre les objets et les primitives Les primitives peuvent tre "enveloppes" dans un objet provenant d'une classe prvue cet effet et appele Wrapper (mot anglais signifiant enveloppeur). Les enveloppeurs sont donc des objets pouvant contenir une primitive et auxquels sont associs des mthodes permettant de les manipuler. 4 Affichage sur sortie standard (cran) Pour afficher un commentaire sur cran, on utilise la mthode println. Pour affiche toto sur cran on crit System.out.println("toto") (La mthode println appartient la classe System.out)

Exemple public class Primitive { public static void main(String[] arg) { System.out.println("Primitives:"); int intA = 12; System.out.println(intA); int intB = intA; System.out.println(intB); intA = 48; System.out.println(intA); System.out.println(intB); System.out.println("Objets"); Entier entierA = new Entier(12); System.out.println(entierA); Entier entierB = entierA; System.out.println(entierB); EntierA.valeur = 48; System.out.println(entierA); System.out.println(entierB); } } class Entier { int valeur; Entier(int v) {valeur=v;} } Affichage Primitives 12 12 48 12 Objets 12 12 48 48 5 Notions de variables, classe et mthodes final

5.1 Variable final Une variable dclare final ne peut plus voir sa valeur modifie (final int x=1 ;). 5.2 Mthodes final Les mthodes final ne peuvent pas tre redfinies dans les classes drives. 5.3 Classes final Une classe final ne peut tre tendue pour crer des sous-classes.

Notions dattributs et mthodes static 5.4 Attribut static Un attribut statique (dclar avec le mot cl static : static int x=3) est un attribut partag par tout les objets de la classe (tout les objet ont la mme valeur pour cet attribut). 5.5 Mthode static Une mthode statique (dclare avec le mot cl static : public static void f( ) ) est une mthode qui na accs quaux membres static de la classe. Le mot cl this this dsigne une rfrence sur lobjet courant. Exemple Point(int _x, int _y) { this._x = _x ; this._y = _y ; } Pour distinguer le paramtre du constructeur lattribut, on utilise le mot cl this 8 Mon premier programme en Java Pour pouvoir excuter un programme en Java, il faut dfinir une fonction particulire appele : main. Cette mthode doit tre contenue dans une classe (le tout objet), elle possde un en-tte obligatoire fix : public static void main(String[] arg) static : signifie quelle ne pourra faire appel quaux champs statiques de la classe String[] arg : tableau darguments du programme Exemple class Exemple { public static void main(String[] arg) { System.out.println("Bonjour" ) ; } }

Notion de Paquetage Un paquetage ou package est un regroupement de classes. On regroupe dans un mme paquetage des classes ayant une thmatique et des fonctionnalits communes. Un paquetage contient des classes et des sous-paquetages. Les classes de lAPI appartiennent plusieurs packages (Exemple : java.util, java.awt). Pour utiliser une classe qui appartient un package de lAPI, on utilise linstruction import suivi du nom du package. Exemple
-

Pour utiliser la classe Vector du package java.util on crit : import java.util.Vector ; au tout dbut du programme. Pour utiliser toutes les classes du package java.util on crit : import java.util.* ;

9.1 Cration de paquetage Si vous souhaitez quune classe que vous avez cre appartienne un package particulier, vous devez le spcifier explicitement au moyen de linstruction package. Il faudra aussi crer un rpertoire au nom du package et sauvegarder les classes appartenant au package dans ce rpertoire. Exemple package MonPackage public class Employe { } La classe Employe doit tre sauvegarder dans un rpertoire appel MonPackage. 9.2 Package et accessibilit 9.2.1 Porte dune classe

La porte dune classe est dfinie comme la zone dans laquelle elle est visible. Seules les classes publiques sont accessibles depuis lextrieur du package. Modificateur de porte aucun public Porte Le paquetage Partout

10

9.2.2 Porte des membres dune classe *protected : Les membres dune classe peuvent tre dclars protected. Dans ce cas, laccs en est rserv aux mthodes des classes drives, des classes appartenant au mme package ainsi quaux classes appartenant au mme package que les classes drives. *private : Accs au niveau de la classe *public : accs partout Remarque Un attribut sans modificateur (modificateur par dfaut) nest pas accessible depuis lextrieur du paquet de la classe. 10 Les tableaux 10.1 Dclaration Exemple: int[] x o int x[]; x est un handle (rfrence) correspondant un tableau qui contient des entiers. 10.2 Initialisation int[] x; x = new int[dimension]; x est un rfrence sur un tableau de taille gale dimension Remarques * Les tableaux de littraux peuvent contenir des variables. Exemple: int a =1, b= 2; int [ ] y = {a,b}; Si on ne fait pas d'initialisation, une initialisation automatique est alors faite (pour les tableaux de primitives 0, pour les tableaux de handles null)

10.3 Taille des tableaux La taille d'un tableau est fixe. Nanmoins, il n'est pas ncessaire qu'elle soit connue au moment de la compilation. Exemple Import java.util.*;

11

class Test2 { public static void main(String[] arg) { int x = Math.abs((new Random())%10; int[] y; y = new int[x] ; System.out.println(x); } } Dans ce cas, on peut connatre la taille d'un tableau avec le champs length (System.out.println(y.length)). 10.4 Les tableaux multi-dimensionnels Syntaxe int[][] x; x = new int[2][4]; Initialisation int[][] x = {{1,2,3,4}, {5,6,7,8}}; Les chanes de caractres En Java, les chanes de caractres sont des objets. Ce sont des instances de la classe String. Java utilise une approche particulire, en effet, les contenus des chanes de caractres ne peut plus tre modifi une fois initialis ( Les chanes de caractres se comportent comme des primitives). Exemple public class chaines { public static void main(String[] arg) { String chaineA = new String ("chaine1"); System.out.println(chaineA); String chaineB = chaineA; System.out.println(chaineB); ChaineA = "chaine2"; System.out.println(chaineA);

12

System.out.println(chaineB);}} Rsultat chane1 chane1 chaine2 chaine1 Bien que les chanes sont des objets, ils se comportent ici comme des primitives. Cela est d au fait que les chanes ne peuvent tre modifies. Remarque Java dispose d'une autre classe, appele StringBuffer, qui permet de grer des chanes dynamiques. 11.1 La classe "StringBuffer"

La classe StringBuffer permet de modifier des chanes de caractres notamment grce la mthode append( ). Exemple StringBuffer chaine; chaine = new StringBuffer ("Bon"); chaine.append("jour"); System.out.println(chaine); Affichage Bonjour 11.2 Quelques mthodes relatives la classe "String" Concatnation Les chanes de caractres peuvent tre concatnes Exemple String chaine1 = "Bonjour"; String chaine2 = "tout le monde"; chaine 1 = chaine1 + chaine2; // cration d'une chane constante "bonjour tout le monde et affectation la variable chaine1 La mthode length( ) length( ) retourne le nombre de caractres de la chaine. La mthode equals( ) equals( ) permet de tester l'galit de deux chanes de caratres

13

Remarque L'emploi de l'oprateur = = pour tester l'galit de 2 chanes n'est pas correct ( = = teste l'galit des rfrences des variables et non celles de leurs contenus). La mthode substring( ) La mthode substring ( ) extrait une sous-chane d'une chane donne. La sous-chane commence l'indice donn en premier argument et se termine l'indice donn en second argument. Exemple String chaine; String chaine1; chaine1.substring(2,6);

14

CHAPITRE 3 : L'HERITAGE 1 Proprits de l'hritage en Java Supposons qu'on dispose de 2 classe A et B, si B hrite de A, on appelle B la sous classe et A la super classe. Une sous-classe possde tous les champs et toutes les mthodes de sa super classe l'exclusion de ceux qui sont privs. Chaque classe ne peut avoir qu'une super classe (pas d'hritage multiple) Pour dfinir une sous-classe, on utilise le mot cl extends Exemple
ANIMAL

CHIEN

CHAT

OISEAU

BERGER

CANICHE

class Animal { private bool vivant ; private int age ; public Animal(int a) { age = a ; vivant = true ; } public void veillir( ) {++ age ; } public void mourir( ) { vivant = false ; } public void crier( ) {} }

15

Canari extends Animal { void crier() { System.out.println(Coucouc) ; } La mthode crier( ) est redfinie dans la classe Canari. La mthode crier( ) de la classe Animal est toujours accessible mais en la prfixant du mot cl super. Exemple Class Canari extends Animal { public Canari (int a) { super (a) ; } } 2 Constructeur de sous-classe Pour utiliser un constructeur dans une sous-classe, il faut ncessairement le redfinir dans cette sous-classe. Remarque Si on ninvoque pas le constructeur de la classe mre, il faut ncessairement avoir un constructeur vide au niveau de la classe mre sinon le compilateur fera appel au constructeur vide par dfaut. Si un constructeur est dfinis au niveau de la classe mre, le constructeur vide par dfaut nexiste plus, si un constructeur vide nest pas dfini, il y aura une erreur de compilation. Exemple class Numero { private int num ; public void plusUn( ) { num ++ ;} } Numero n1 = new Numero( ) ; n1.plusUn( ) ; Maintenant si on dfinit un constructeur : class Numero {

16

private int num ; public void plusUn( ) { num ++ ;} public Numero(int valeurDebut) { num = valeurDebut ;} Si on crit Numero n = new Numero( ) on aura une erreur ! ! Remarque En java, il nexiste plus de notion dhritage publique, priv ou protg. 3 Surcharge dune mthode hrite La classe Canari redfinit la mthode crier( ), on dit que la mthode crier est surcharge. Exemple Animal a = new Animal(5) ; Canari c = new Canari(10) ; a.crier( ) (on aura aucun affichage) c.crier( ) (on aura un affichage) On dit que la mthode est polymorphe. Elle a plusieurs formes, et chaque appel, la forme excuter est choisie en fonction de lobjet associ lappel. Remarque Plus besoin de fonctions virtual comme en C++ pour que le polymorphisme se fasse. Java utilise en effet une liaison tardive (late binding) 3.1 Le late binding Java utilise une technique particulire pour dterminer quelle mthode doit tre appele. Dans la plupart des langages, le lien entre lappel et la mthode est tabli au moment de la compilation. Cette technique est appele early binding , que lon pourrait traduire par liaison prcoce. Java utilise cette technique pour les appels de mthodes final. En revanche, pour les mthodes qui ne sont pas final, Java utilise la technique du late binding (liaison tardive). Dans ce cas, le compilateur ntablit le lien entre lappel et la mthode quau moment de lexcution du programme. Ce lien est tabli avec la version la plus spcifique de la mthode.

17

4 Mthodes et classes abstraites 4.1 Mthodes abstraites Une mthode est abstraite si seul son en-tte est donn, le corps est remplac par un point virgule, la mthode est alors de type astract . Exemple public abstract void resolution( ) ; 4.2 Classes abstraites Une classe qui possde au moins une mthode abstraite est abstraite et doit tre dclare avec le modificateur : abstract. Exemple Intressons-nous la dfinition dune classe dont les instances reprsenteront les rglements des factures envoyes aux clients dune entreprise. Un client peut rgler par chque, par virement ou encore par traite. Rglement

Rchque

Rcrdit

Rtraite

abstract class Reglement { abstract float credite( ) ; } class Rchque extends Reglement { ..... float credite( ) {...... ensembles dinstructions....... } }

18

Une mthode abstract correspond une proprit dont on veut forcer limplmentation dans chaque sous-classe. Si une sous-classe ne redfinit pas une mthode abstract, et si cette mthode nest pas aussi abstract dans cette sous-classe on aura automatiquement une erreur. 5 Les interfaces Java nadmet pas dhritage multiples (hritage partir de plusieurs classes). Pour rpondre certaines situations, Java permet une forme dhritage multiple avec des classe trs particulires que lon appelle interface. Les interfaces possdent un niveau dabstraction suprieur celui des classes abstraites. Contrairement aux classes abstraites, les interfaces : Ne possdent pas de champs, lexception des constantes (champs de classe constants), Ont des mthodes qui sont toutes implicitement abstraites (elles nont pas de corps), Comme pour les classes abstraites une interface ne peut tre instancie.

Une interface est dclare grce au mot cl inteface Exemple public interface UneInterface { public void method1( ) ; public double method2( ) ; } Une classe peut hriter des caractristiques dune interface, on dira dans ce cas que la classe implmente linterface car elle devra obligatoirement redfinir toutes les mthodes de linterface. Pour spcifier le fait quune classe implmente une interface, on utilise le mot cl implements. Exemple Public interface UneInterface { public void method1( ) ; public void method2( ) ; } class UneClasse implements uneInterface { // champs..... public void method1( ) {

19

// ensemble dinstructions } public void method2( ) { //ensemble dinstructions } } Remarque - Une interface peut tendre une autre interface - Une classe peut implmenter plusieurs interfaces, mais ne peut tendre quune seule classe (abstraite ou non).

20

CHAPITRE 4 : GESTION DES EXCEPTIONS 1 Comment grer les erreurs dexcution ? Exemple public class Ville { protected int nbHabitants ; public void setNbHabitants (int unEntier) { if (unEntier <= 0) erreur(un nbr dhabitants doit tre >0) ; nbHabitants = unEntier ; } protected void erreur (String message) { System.out.println(classe+ getClass( ).getName( ) + :+message) ; System.exit(1) ; } } La fonction getClass( ) renvoie un objet de la classe. La fonction getName ( ) renvoie le nom de la classe. Sur lexemple on peut considrer que larrt est brutal. Pour cela on utilise la notion dexception qui permet de grer les erreurs. 2 Mcanisme des exceptions une exception est un objet qui est instanci lors dun incident : on dit quune exception est leve. Lorsquune exception est leve, le traitement du code de la mthode est interrompu et lexception est propage travers la pile dexcution de mthode appele en mthode appelante. Si aucune mthode ne capture lexception, celle-ci remonte jusqu la mthode du fond de la pile dexcution : lexcution se termine avec une indication derreur. Dclaration Exemple class NbHabException extends Exception { // Instructions.. } class Ville {

21

public void setNbHabitants (int unEntier) throws NbHabException // throws signifie que la mthode est susceptible de lever une exception { if (unEntier<=0) throw nbHabException(unEntier); //lever une exception 3 Propager ou capturer une exception Supposons que dans la classe Ville, on a un constructeur avec 2 arguments qui appelle la mthode SetNbHabitants( ); Exemple public Ville(String nomVille, int population) { this (nomVille); setNbHabitants(population); } On aura une erreur de compilation, en effet il faudra soit propager l'exception, soit la capturer. Propager On utilise le throws public Ville(String nomVille, int population) throws NbHabException {. } Capturer La capture d'une exception est effectue avec les clauses try et catch La clause try dfinit un bloc d'instructions pour lequel on dsire capturer les exceptions ventuellement leves. La clause catch dfinit l'exception capturer, en rfrenant l'objet de cette exception par un bloc de paramtres puis le bloc excuter en cas de capture.

Exemple void method( ) { String nomV; int nbh; Ville v1; try { v1 = new Ville(nomV, nbh); } //nous voulons capturer certaines exceptions, si elles sont leves o propages lors de l'excution du bloc qui suit try

22

catch(nbHabException nEx) { System.out.println("Fichier Incohrent"); System.out.println(nEx); System.exit(1); } //traitement de l'exception

23

CHAPITRE 5 : LES ENTREES / SORTIES 1 Gnralits sur les flots de donnes Les flots de donnes permettent la gestion des oprations de lecture et d'criture sur ou vers des sources diffrentes. Il existe quatre classes principales permettant de traiter les flots: Flots d'octets InputStream OutputStream

Flots de caractres Reader Writer

Les noms des classes de flux (Hritant des classes abstraites InputStream, OutputStream, Reader et Writer) se comprennent assez aisment si l'on utilise ces termes comme suffixe permettant de dterminer la nature du flux. Pour la source ou la destination, on utilise les prfixes suivants: Source ou Destination Chane de caractres Fichier Flux d'octets Exemple StringWriter (Hritant de la classe Writer): flux de caractres en critures, cre paartir d'une chane de caractres. FileInputStream (Hritant de la classe InputStream): flux d'octets en lecture, cre partir d'un fichier. InputStreamReader (Hritant de la classe Reader): flux de caractres en lecture construits partir d'un flux d'octets. 2 Saisir des donnes envoyes par le clavier Pour saisir les donnes envoyes par le clavier on utilise gnralement deux classes appartenant au paquetage java.io: InputStreamReader et BufferedReader (flux de caractres en lecture construit partir d'un Buffer). Prfixe String File InputStream ou OutputStream

24

Remarque On utilise la classe BufferedReader car elle contient une mthode readLine( ) permettant la lecture d'une chane de caractre. Avec la classe InputStreamReader on ne peut lire des caractres qu'un par un. 2.1 Construction d'objets BufferedReader et InputStreamReader BufferedReader a un constructeur qui prend en argument une instance de Reader (dont hrite InputStreamReader). InputStreamReader admet quant elle un constructeur ayant comme argument un flot d'entre (le flot d'entre sur clavier est dsign par System.in). 2.2 Exemple de lecture partir du clavier String ligne; BufferedReader fluxEntree = new BufferedReader( new InputStreamReader(System.in)); ligne = fluxEntree.readLine( ); Remarques!!
-

La mthode readLine( ) lance une exception du type IOException(Input Output Exception) qu'il faudra grer. Pour pouvoir lire des types doubles, int,il faudra utiliser la mthode readLine( ) pour lire des caractres et faire un cast avec les mthodes valueOf( ) et doubleValue( )

Exemple complet import java.io.*; class Saisie { public static void main(String[] arg) { String ligne; double x; BufferReader entree = new BufferedReader (new InputStreamReader(System.in)); try{ ligne = entree.readLine( ); x = Double.valueOf(entree).doubleValue( ); System.out.println(x); } catch(Exception e){ System.out.println("Erreur de lecture"); System.exit(1); }

25

} } 3 Lire ou crire des caractres dans un fichier La classe FileReader permet de lire des caractres dans un fichier. Cette classe contient un constructeur qui a comme argument une chane de caractres reprsentant le nom du fichier. La classe FileWriter permet d'crire des caractres dans un fichier. Cette classe contient un constructeur qui a comme argument une chane de caractres reprsentant le nom du fichier. Exemple Supposons que l'on veuille crire un programme permettant d'crire une chane de caractres dans un fichier nomm copie-essai.txt puis copier le fichier essai.txt caractre par caractre dans notre fichier copie-essai.txt. Nous allons utiliser pour cela les deux classes FileReader et FileWriter import java.io.*; class LireEcrireTexte { public static void main(String arg[]) throws IOException { FileReader lecteur; FileWriter ecrivain; int c; lecteur = new FileReader("essai.txt"); ecrivain = new FileWriter("copie-essai.txt"); ecrivain.write("on essaye de faire une copie"); while( (c = lecteur.read( ) ! = -1 ) ecrivain.write(c); lecteur.close( ); ecrivain.close( ); } } Remarque La mthode read( ) renvoie 1 si on est en fin de flux 4 Ecrire et lire dans un fichier texte 4.1 Ecrire dans un fichier texte

26

Pour crire dans un fichier texte (on crit des chanes caractres et plus des caractres seulement), on utilise gnralement la classe PrintWriter pour pouvoir utiliser la mthode println(String) de la mme faon qu'avec System.out. La classe PrintWriter possde un constructeur qui a comme argument un objet Writer. Exemple import java.io.*; class EcrireFichierTexte { public static void main(String arg[]) throws IOException { int n = 5; PrintWriter ecrivain = new PrintWriter(new BufferedWriter( new FileWriter(arg[0]))); ecrivain.println("Bonjour"); ecrivain.println(n); ecrivain.println(new Integer(36)); ecrivain.close( ); } } Remarque On aurait pu plus simplement initialiser ecrivain par: ecrivain = new PrintWriter(new FileWriter(arg[0])); mais alors les critures n'utiliseraient pas de mmoire-tampon. 4.2 Lecture dans un fichier texte Pour pouvoir lire des chanes de caractres partir d'un fichier on utilise gnralement la classe BufferedReader. La classe dispose d'un constructeur qui admet comme argument un objet de type Reader (On utilise gnralement un objet FileReader). Exemple import java.io.*; class lireLigne { public static void main(String[] arg) throws IOException { BufferedReader lecteurAvecBuffer = null; String ligne; try { lecteurAvecBuffer = new BufferedReader(new FileReader(arg[0])); } catch (FileNotFoundException e) { System.out.println("Erreur d'ouverture");
27

} while ( (ligne = lecteurAvecBuffer.readLine( ) ) ! = null) System.out.println(ligne); lecteurAvecBuffer.close( ); } }

28

CHAPITRE VI: INTERFACES GRAPHIQUES 1 Introduction Gnralement en dveloppement objet, on distingue l'interface graphique de la partie traitement. Cette sparation est prfrable, elle respecte les principes de la programmation objet et simplifie grandement le travail de migration en cas de changement de l'interface graphique. L'avantage apport par Java en matire d'interface graphique est que toute interface dveloppe sur une machine donne avec un systme d'exploitation donn, peut tre porte sur une machine diffrente avec un autre systme d'exploitation, et cela sans rcriture du code. L'aspect visuel de cette interface est trs peu modifi par ce portage. 2 Applets et applications graphiques Les programmes graphiques en Java se divisent en deux catgories: les applets et les applications graphiques. 2.1 Applet Un applet est un programme qui s'excute dans un navigateur Web, partir d'un document HTML. Avantage: Interactivit Inconvnient: Scurit 2.2 Applications graphiques a Fentre vide Les composants des applications graphiques sont rassembls dans une bibliothque nomme AWT. Exemple import java.awt.*; public class Bonjour { public static void main(String[] arg) { Frame fen; fen = new Frame("bonjour"); fen.setSize(250,100); fen.setVisible(true);

29

} } Remarque Pour le moment le seul moyen de fermer la fentre est de fermer la machine virtuelle CTRL+C On verra plus tard que les applets contrairement aux interfaces graphiques utilisent des Panel et non des Frame.

b Fentres contenants des messages Exemple import java.awt.*; class SortieTexteGraph extends TextArea { SortieTexteGraph(String texte, int nbLignes, int nbColonnnes, String police, int typePolice, int taillePolice) { super(texte, nbLignes, nbColonnes, SCROLLBARS_NONE); setFont(new Font(police, typePolice, taillePolice)); setEditable(false); } } La classe SortieTexteGraph tend la classe TextArea qui est un modle de composant graphique utilis pour crire du texte portant sur plusieurs lignes. Le constructeur de TextArea est invoqu par super( ), en plus du message afficher, il fixe le nombre de lignes et de colonnes que peut afficher ce composant. Le dernier argument du constructeur rgle la prsence ou l'absence des barres de dfilement, ici nous avons choisi de ne pas faire apparatre (SCROLLBARS_NONE). La police de caractres est cre grce setFont qui elle mme utilise la mthode Font. Enfin le message ne pourra pas tre modifi par l'utilisateur dans la fentre graphique setEditable(false). Exemple de classe utilisant SortieTextGraph import java.awt.*; public class MessageComposant1 extends Frame { SortieTexteGraph zoneTexte; int nbLignes = 5; int nbColonnes = 20;

30

public MessageComposant1 (String titre, String message, int taillePolice) { super(titre); zoneTexte = new SortieGraph(message, nbLignes, nbColonnes, "Serif", Font.BOLD, taillePolice); add(zoneTexte, "North"); } public static void main(String[] arg) { MessageComposant1 fen; String titre = "Affichage dans une fentre texte"; String mess = "Un composant \n TextArea \n permet l'affichage \n" + "de plusieurs lignes \n"; fen = new MessageComposant(titre, mess, taillePolice); fen.pack( ); fen.setVisible(true); } } La mthode pack( ) dtermine la taille de la fentre en fonction des lments qu'elle contient. Gestionnaire de mise en page L'ajout d'une zone de texte la fentre se fait sous le contrle d'un gestionnaire de mise en page. Le rle d'un gestionnaire de mise en page (Layout Manager) est de placer les composants graphiques dans la fentre. Il existe cinq gestionnaires de mise en page, qui ont chacun des rgles de mise en page qui leur sont propres: BorderLayout FlowLayout CardLayout GridLayout GridBagLayout

BorderLayout Le gestionnaire attach par dfaut une fentre de type Frame est un BorderLayout, dont la caractristique principale est de distinguer cinq zones dans la fentre: nord, sud, centre, ouest et est. Remarque Nous pouvons insrer un nouveau gestionnaire en utilisant la mthode setLayout(new FlowLayout( )).

31

c Lecture et criture de texte La classe TextArea fournit un modle de composant destin l'affichage ou l'dition de plusieurs lignes de texte. La classe TextField quant elle est ddie l'dition ou l'affichage d'une seule ligne de texte. Elle est bien adopte la saisie de valeurs numriques ou de textes brefs (entres au clavier). Exemple public class TextFieldDemo extends Frame { public TextFieldDemo( ) { String titre = "Demonstration de textField"; setTitle(titre); setLayout(new FlowLayout( ) ); TextField zoneEntree = new TextField("Entrer un nombre dans ce champ"); add(zoneEntree); } } d Etiquettes (label) Les composants de type label sont des tiquettes que l'on place ct des autres composants (zone de texte, liste) pour les lgender. Exemple public class labelDemo extends Frame { public labelDemo( ) { String titre = "dmonstration de label et de TextField"; setTitle(titre); setLayout( new FlowLayout( ) ); label etiquetteZoneEntree = new label("coefficient du terme en x2"); add(etiquetteZoneEntree); TextField zoneEntree = new TextField("3.14"); Add(zoneEntree); } } e Buttons (Bouton) Les composants de type Button sont des boutons classiques dont on se sert pour provoquer des actions.

32

Exemple public class ButtonDemo extends Frame { public ButtonDemo( ) { String titre = "Dmonstration de boutons" setTitle(titre); setLayout(new FlowLayout( ) ); Button boutonValider = new Button("valider"); add(boutonValider); Button boutonAnnuler = new Button("Annuler"); Add(boutonAnnuler); } } f Menus Les menus utilisent les classes Menu, MenuItem et MenuBar. Un objet de type Menu est un menu droulant qui est attach une barre de menu (MenuBar) et comporte des lments (MenuItem). MenuItem et MenuBar sont des sous-classes de MenuComposant et Menu une sous classe de MenuItem. Exemple public class MenuDemo extends Frame { public MenuDemo( ) { string titre = "demonstration menu"; setTitle(titre); MenuBar barreMenu = new MenuBar( ); setMenuBar( barreMenu); //ajoute la barre de menu la fentre Menu menuFichier = new Menu("Fichier"); Menu menuEdition = new Menu("Edition"); Menu menuAide = new Menu("Aide"); barreMenu.add(menuFichier); barreMenu.add(menuEdition); barreMenu.add(menuAide); MenuItem menuNouveau = new MenuItem("nouveau"); MenuItem menuOuvrir = new MenuItem("ouvrir"); menuFichier.add(menuNouveau); menuFichier.add(menuOuvrir); } }

33

CHAPITR VII Les accs rseau en Java


1. Accs via une URL Une URL contrairement au chemin daccs classique un fichier permet de dsigner un fichier de manire uniforme quelque soit le systme qui hberge ce fichier. Une URL est compose : - Dune chane reprsentant le protocole utiliser au fichier (Exemple : http, ftp) suivi du symbole : - Le nom de lhte qui fournit le service recherch (Exemple : www.yahoo.fr) - Le chemin daccs au fichier recherch sur lhte. Les rpertoires ventuels de ce chemin sont spars par le symbole / Remarque Une URL peut reprsenter un fichier mais aussi de manire plus gnrale une ressource (par exemple un programme renvoyant un rsultat) 2. Manipulation dune URL Pour manipuler une URL on va utiliser un certain nombre de classes appartenant au package java.net. La classe URL La classe URL permet de crer un objet permettant la manipulation dune URL. Diffrents constructeurs sont dfinis dans la classe URL, nous pouvons par exemple utiliser le constructeur suivant : public URL(String s) throws MalformedURLException Ce constructeur contient comme paramtre une chane de caractres qui reprsente le chemin daccs au fichier. Ce chemin contient le protocole daccs, ladresse de lURL et le chemin daccs au fichier (exemple : http://www.isaip.uco.fr/MonRepertoire/MonFichier). Les diffrents constructeurs dURL sont susceptibles de lever une exception du type MalformedURLException si laccs lURL nest pas possible. Plusieurs mthodes sont dfinis dans la classe URL, ces mthodes permettent de lire des donnes, de fournir le protocole daccs, de fournir le nom de lhte public String getProtocol() renvoie le protocole daccs public String getHost() renvoie le nom du hte public final inputStream openStream() throws IOException permet de lire des donnes partir de lURL

34

Exemple Le programme suivant permet de lire le contenu dune URL et de lafficher sur la sortie standard. import java.io.*; import java.net.*; class LectureURLSansConnexion { public static void main(String[] arg) { try { URL y = new URL("http://www.isaip.uco.fr/"); DataInputStream dis = new DataInputStream(y.openStream()); String inputLine; while( (inputLine=dis.readLine()) != null) System.out.println(inputLine); dis.close(); } catch(MalformedURLException me) { System.out.println("Erreur de connection l'URL"); } catch(IOException ioe) { System.out.println("Erreur d'ouverture du flux"); } } } 3. Connexion une URL Nous pouvons ouvrir une connexion avec une URL en utilisant la mthode openConnection() de la classe URL. public URLConnection openConnection() throws IOException La mthode openConnection() renvoie un objet de la classe URLConnection. Cette classe est abstraite et permet de grer la connexion avec lURL. Les mthodes de la classe URLConnection permettent de lire, crire dans le fichier dsign par lURL, mais aussi dobtenir plein dinformations sur ce fichier (taille, date de cration,).

35

Pour ouvrir une dURLConnection.

connexion

avec

lURL

nous

utilisons

la

mthode

connect()

Lecture et Ecriture dans une URL en utilisant URLConnection Nous avons vu quen utilisant la classe URL nous pouvons lire le contenu dune URL. Avec URLConnection nous pouvons non seulement lire le contenu dune URL mais aussi linterroger sur son contenu et y crire. Pour lire et crire avec URLConnection nous utilisons les fonctions suivantes : public InputStream getInputStream() throws IOException public OutputStream getOutputStream() throws IOExceptio Exemple Le programme suivant permet de lire le contenu dune URL et dafficher son contenu sur la sortie standard en utilisant la classe URLConnection. import java.net.*; import java.io.*; class LectureURLAvecConnexion { public static void main(String[] arg) { try { URL y = new URL("http://www.yahoo.fr/"); URLConnection c = y.openConnection(); DataInputStream dis = new DataInputStream(c.getInputStream()); String inputLine; while ((inputLine = dis.readLine())!= null) { System.out.println(inputLine); } dis.close(); } catch(MalformedURLException me) { System.out.println("Pb URL!!!"); } catch(IOException ioe) { System.out.println("Erreur lecture"); } } }

36

CHAPITRE VIII : LES THREADS Quest ce quun Thread ? Un processus ou tche est un programme en cours dexcution. Les systmes dexploitation modernes sont presque tous multitches. Ils sont conus de faon que plusieurs programmes indpendants puissent sexcuter en mme temps. Cette simultanit de lexcution des programmes nest gnralement quapparente. Si lon y regarde de plus prs, le systme dexploitation attribue, tour de rle, le processeur chaque processus. Cette attribution est faite pendant de courts intervalles de temps. Elle donne lillusion dun droulement continu et simultan des processus. Les processus sont indpendants les uns des autres, ils ont chacun leur propre espace mmoire. A linverse quand un programme cre des Threads (appels processus lgers), ils se partagent lespace de travail du processus qui leur a donn le jour. On est naturellement amen crer des Threads pour des travaux en interaction, mme faible. Dans le cas contraire, il vaut mieux raliser des programmes distincts. Comment raliser un Thread ? La ralisation dun Thread se fait trs simplement en concevant une sous-classe de la classe Thread (appartient au package java.lang). Cette classe doit tre dote dune mthode nomme run() qui est appele lors du dmarrage du Thread. Pour lancer un Thread, il faudra appele la mthode start() partir dun objet issu de la sous-classe de Thread quon a cre. Exemple class MonThread extends Thread { public MonThread() { } public void run( ) { for(int i = 1 ; i<= 100 ; i++) System.out.println(i) ; } public static void main(String[] arg) { new MonThread().start() ; new MonThread().start() ; } } Pour renvoyer le nom du Thread nous pouvons utiliser la mthode getName() de la classe Thread.

37

Contrler le droulement dun Thread Plusieurs mthodes peuvent tre invoques pour contrler le droulement dun Thread : wait() : mise en attente du Thread sleep(int) : interrompt le droulement pendant une dure qui peut tre spcifie en paramtre yield(() : interrompt le droulement afin de laisser du temps pour lexcution des autres Threads Linterface Runnable En tendant la classe Thread on sinterdit de pouvoir tendre une autre classe puisque lhritage multiple nest pas autoris en Java. Cette limitation est parfois fort gnante, cest la raison pour laquelle il existe une autre faon de procder. Pour quune classe nhritant pas de la classe Thread ait les mmes proprits dun Thread elle doit implanter linterface Runnable. On la dote alors dune mthode run(), ce qui est la seule exigence de cette interface. Exemple class MonThread2 implements Runnable { public void run() { for(int i=1; i<=100; i++) System.out.println(i+" "+ Thread.currentThread().getName()); } public static void main(String[] arg) { MonThread2 t1 = new MonThread2(); MonThread2 t2 = new MonThread2(); Thread unThread1 = new Thread(t1); Thread unThread2 = new Thread(t2); unThread1.start(); unThread2.start(); } } La synchronisation Quand plusieurs Threads font appel, en mme temps, un seul objet il peut y avoir alors des comportements imprvisibles rsultants de conflits daccs cette ressource. Cette situation est bien illustre par lexemple classique de retraits simultans sur un compte bancaire. Plusieurs personnes retirent, en mme temps, dans des agences diffrentes une somme correspondant au solde dun mme compte. Il y a alors, un risque que ce compte passe au rouge. Pour lviter, il faut que le compte soit verrouill du dbut la fin dun retrait. Toute autre opration simultane est alors interdite. Pour poser un verrou sur un objet, on dclare des mthodes synchronise, on utilise pour cela le mot cl synchronized.

38

Exemple public synchronized void retirerArgent(float somme) Quand un Thread invoque une mthode synchronise dun objet, il pose un verrou sur cet objet qui ne sera libr qu la fin de la mthode. Si un autre Thread invoque une mthode synchronise dun objet, il pose un verrou sur cet objet qui ne sera libr qu la fin de la mthode. Si un autre Thread invoque une mthode synchronise de cet objet, il sera bloqu jusqu la leve du verrou pos par le Thread prcdent. Ce mcanisme empche les accs concurrents un objet.

39