Programmation Java Avancee Francais

  • Upload
    anis

  • View
    220

  • Download
    1

Embed Size (px)

Citation preview

Programmation JAV avance A Sun service formation

Programmation JAV avance A Sun service formation

Programmation JAV avance A Sun service formation

Programmation JAV avance A Sun service formation

Projet : Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Projet : Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Projet : Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Projet : Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Projet : Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Rvision : Date :

F-beta 18/2/99

Rvision : Date :

F-beta 18/2/99

Rvision : Date :

F-beta 18/2/99

Rvision : Date :

F-beta 18/2/99

Rvision : Date :

Sun Microsystems

Sun Microsystems

Sun Microsystems

Sun Microsystems

Sun Microsystems

Programmation JAV avance A Sun service formationF-beta 18/2/99

Programmation JAV avance A

Programmation JAV avance A

Programmation JAV avance AProjet : avance Copyright Rf. Sun : Rvision : Date :

Sun service formation

Sun service formation

Projet : avance Copyright Rf. Sun :

Programmation JAVA Sun Service Formation SL275

Projet : avance Copyright Rf. Sun :

Programmation JAVA Sun Service Formation SL275

Programmation JAVA Sun Service Formation SL275

Rvision : Date :

F-beta 18/2/99

Rvision : Date :

F-beta 18/2/99

F-beta 18/2/99

Sun Microsystems France

Sun Microsystems France

Sun Microsystems France

Sun service formation

Programmation JAVA avance Sun service formation

Intitul Cours : Copyright Rf. Sun : Sun Microsystems France S.A. Service Formation 143 bis, avenue de Verdun 92442 ISSY LES MOULINEAUX Cedex Tel 01 41 33 17 17 Fax 01 41 33 17 20 Rvision : Date :

Programmation JAVA avance Sun Service Formation SL275 F-beta 18/2/99

Sun Microsystems France

Protections Juridiques 1998 Sun Microsystems, Inc. 2550 Garcia Avenue, Mountain View, California 94043-1100 U.S.A.

AVERTISSEMENTCe produit ou document est protg par un copyright et distribu avec des licences qui en restreignent lutilisation, la copie, la distribution, et la dcompilation. Aucune partie de ce produit ou de sa documentation associe ne peut tre reproduite sous aucune forme, par quelque moyen que ce soit, sans lautorisation pralable et crite de Sun et de ses bailleurs de licence, sil y en a. Des parties de ce produit pourront tre drives du systme UNIX licenci par Novell, Inc. et du systme Berkeley 4.3 BSD licenci par lUniversit de Californie. UNIX est une marque enregistre aux Etats-Unis et dans dautres pays et licencie exclusivement par X/Open Company Ltd. Le logiciel dtenu par des tiers, et qui comprend la technologie relative aux polices de caractres, est protg par un copyright et licenci par des fournisseurs de Sun. Sun, Sun Microsystems, le logo Sun, sont des marques dposes ou enregistres de Sun Microsystems, Inc. aux Etats-Unis et dans dautres pays. Toutes les marques SPARC, utilises sous licence, sont des marques dposes ou enregistres de SPARC International, Inc. aux Etats-Unis et dans dautres pays. Les produits portant les marques SPARC sont bass sur une architecture dveloppe par Sun Microsystems, Inc. Les interfaces dutilisation graphique OPEN LOOK et Sun ont t dveloppes par Sun Microsystems, Inc. pour ses utilisateurs et licencis. Sun reconnat les efforts de pionniers de Xerox pour la recherche et le dveloppement du concept des interfaces dutilisation visuelle ou graphique pour lindustrie de linformatique. Sun dtient une licence non exclusive de Xerox sur linterface dutilisation graphique Xerox, cette licence couvrant aussi les licencis de Sun qui mettent en place linterface dutilisation graphique OPEN LOOK et qui en outre se conforment aux licences crites de Sun. Le systme X Window est un produit de X Consortium, Inc. CETTE PUBLICATION EST FOURNIE EN LETAT SANS GARANTIE DAUCUNE SORTE, NI EXPRESSE NI IMPLICITE, Y COMPRIS, ET SANS QUE CETTE LISTE NE SOIT LIMITATIVE, DES GARANTIES CONCERNANT LA VALEUR MARCHANDE, LAPTITUDE DES PRODUITS A RPONDRE A UNE UTILISATION PARTICULIERE, OU LE FAIT QUILS NE SOIENT PAS CONTREFAISANTS DE PRODUITS DE TIERS.

Protections JuridiquesIntutil Cours : Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7Rvision : F-beta Date : 18/2/99

Applets (rappels), archives jar ...............................................12Applets : lancement ........................................................................... 13 Applets: protocoles ............................................................................ 15 Applets : cycle de vie ......................................................................... 17 Applets : demandes au navigateur.................................................. 18 Applets : demandes du systme de fentrage ............................... 19 Applets : exemple............................................................................... 20 Applets : utilisation darchives Jar .................................................. 21 Applets : Ressources dans une archive Jar..................................... 22 Le systme de scurit de Java......................................................... 23 Applications autonomes: scurit ................................................... 24 Applications autonomes : archives Jar............................................ 25

Le package AWT (rappels), LayoutManagers .....................28Accs aux manipulations graphiques ............................................. 29 Les gestionnaires de Disposition (LayoutManager) ..................... 31 FlowLayout : ....................................................................................... 32 BorderLayout :.................................................................................... 33 GridLayout :........................................................................................ 34 CardLayout : ....................................................................................... 35 GridBagLayout : ................................................................................. 36

Le traitement des vnements AWT (rappels)....................40Les vnements .................................................................................. 41 Modle dvnements JDK 1.1 ....................................................... 42 Comportement de linterface graphique utilisateur Java............. 46 Tableau des interfaces de veille ....................................................... 47 Evnements gnrs par les composants AWT............................. 48 Dtails sur les mcanismes ............................................................... 49 Adaptateurs dvnements............................................................... 50

Les composants SWING..........................................................54Java Foundation Classes ................................................................... 55 Les Composants SWING .................................................................. 57 SWING : hirarchie des composants............................................... 58 Une application Swing de base : ...................................................... 59 La classe JComponent ....................................................................... 62

Les Threads ................................................................................64Concept de thread.............................................................................. 65 Cration dun Thread Java................................................................ 67 Demarrage dun Thread Java ........................................................... 69 Contrle de base des threads ........................................................... 72 Dautres faons de crer des threads............................................... 73 Etats dun Thread (rsum) .............................................................. 74

Accs concurrents .....................................................................76table des matiresCopyright February 18, 1999 Sun Microsystems, Inc. Tous droits rservs. SunService Month 1992

viii

Utilisation du mot-cl synchronized............................................... 77 Interaction de threads- wait() et notify() ........................................ 87 Pour assembler le tout ....................................................................... 92 Classe SyncStack ................................................................................ 98 Etats dun Thread (rsum) ............................................................ 101

Principes des Entres/Sorties ...............................................104Fots E/S avec Java............................................................................ 105 Streams de base ................................................................................ 109 Flots dentre sur URL .................................................................... 111 Readers et Writers............................................................................ 112 Fichiers............................................................................................... 114 Tests de fichiers et utilitaires .......................................................... 115 Fichiers accs direct ...................................................................... 116

La programmation rseau......................................................120Modles de connexions rseau en Java......................................... 121 Programmation rseau en Java ...................................................... 122 Le modle rseau de Java................................................................ 123 Principe dun Serveur TCP/IP....................................................... 124 Principe dun Client TCP/IP.......................................................... 125 changes UDP.................................................................................. 126 Exemple de Serveur UDP .............................................................. 127 Exemple de client UDP ................................................................. 129 UDP en diffusion (Multicast) ...................................................... 131 Exemple de Serveur Multicast ...................................................... 132 Exemple de client Multicast ........................................................... 133

Linarisation des objets (Serialization)..............................136Introduction ...................................................................................... 137 Architecture de srialisation........................................................... 138 Ecriture et lecture dun flot dobjets .............................................. 142 Effets de la linarisation .................................................................. 144 Personnalisation de la linarisation............................................... 145

RMI (introduction technique) ..............................................148Fonction de larchitecture RMI en Java......................................... 150 Packages et hirarchies RMI........................................................... 151 Cration dune application RMI .................................................... 154 Cration dune application RMI .................................................... 155 Scurit RMI...................................................................................... 175

JDBC (introduction technique) ............................................178Introduction ...................................................................................... 179 Pilote JDBC.................................................................................... 180 Organigramme JDBC....................................................................... 182 Organigramme JDBC....................................................................... 183ix introduction a Java et au Java ComputingCopyright February 18, 1999 Sun Microsystems, Inc. Tous droits rservs. SunService Month 1992

Exemple JDBC .................................................................................. 184 Cration de pilotes JDBC ................................................................ 186 Pilotes JDBC ...................................................................................... 188 Instructions JDBC............................................................................. 191 Mthodes setXXX .......................................................................... 193 Mthodes getXXX .......................................................................... 198 Correspondance des types de donnes SQL en Java .................. 199 Utilisation de lAPI JDBC................................................................ 200

Annexe : JNI.............................................................................202Pourquoi raliser du code natif?.................................................... 203 un exemple : "Hello World" en C................................................... 204 prsentation de JNI .......................................................................... 211 JNI: types, accs aux membres, cration dobjets........................ 212 rfrences sur des objets JAVA: ..................................................... 215 exceptions.......................................................................................... 216 invocation de JAVA dans du C...................................................... 217

Annexe : collections................................................................218gnralits ......................................................................................... 219 Vector (java 1.1) ................................................................................ 220 Hashtable (java 1.1).......................................................................... 224 Properties .......................................................................................... 226 Enumeration (java 1.1) .................................................................... 229 Collections en plateforme Java 2.................................................... 230 Collections : dictionnaires, ensembles .......................................... 231 Ordre naturel, comparateurs...................................................... 232 Classes de service : Collections , Arrays ....................................... 233 Itrateurs ........................................................................................... 234

Annexe : les composants AWT.............................................236List...................................................................................................... 241 TextArea ............................................................................................ 244 Frame ................................................................................................. 246 Panel................................................................................................... 247 Dialog................................................................................................. 248 FileDialog .......................................................................................... 250 ScrollPane.......................................................................................... 251 Menus ................................................................................................ 252 MenuBar ............................................................................................ 253 Menu .................................................................................................. 254 MenuItem .......................................................................................... 255 CheckboxMenuItem ........................................................................ 256 PopupMenu ...................................................................................... 257 Contrle des aspects visuels........................................................... 259 Impression......................................................................................... 262

table des matiresCopyright February 18, 1999 Sun Microsystems, Inc. Tous droits rservs. SunService Month 1992

x

Annexe : lvolution des APIs JAVA ..................................264Graphique, Multimedia................................................................... 265 Rseau................................................................................................ 266 Utilitaires, composants.................................................................... 267 Utilitaires programmation .............................................................. 268 Accs donnes .................................................................................. 269 Echanges scuriss ........................................................................... 270 Embarqu lger ................................................................................ 271 Systme.............................................................................................. 272 Produits divers ................................................................................. 274 Java Enterprise APIs ........................................................................ 275 Sun Microsystems France 278

xi

introduction a Java et au Java ComputingCopyright February 18, 1999 Sun Microsystems, Inc. Tous droits rservs. SunService Month 1992

Applets (rappels), archives jarpoints essentiels :Rappels :

1

Les Applets constituent des petites applications java hberges au sein dune page html, leur code est tlcharg par le navigateur. Une Applet est, la base, un panneau graphique. Un protocole particulier le lie au navigateur qui le met en oeuvre (cycle de vie de lApplet). Le code de lApplet fait ventuellement appel du code ou des ressources qui sont situes sur le serveur http. Pour minimiser les changes navigateur/serveur il est intressant de mettre les codes et les ressources concernes dans des archives Jar. Les codes de lApplet sont soumis des restrictions de scurit. Il est galement possible dutiliser des archives jar et les mcanismes de scurit pour des applications autonomes.

Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Rvision : F-beta Date : 18/2/99

1Applets : lancementSyntaxe des balises HTML : [] [] . . . . . [alternateHTML] Exemple :

Evolutions futures (HTML 4) : >

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/13Rvision : F-beta Date : 18/2/99

1Applets : lancementAu sein dun document HTML une Applet est une zone graphique gre par un programme tlcharg par le navigateur. La balise HTML APPLET comporte les attributs suivant :

code=appletFile.class - Cet attribut obligatoire fournit le nom du chier contenant la classe compile de lapplet (drive de java.applet.Applet). Son format pourrait galement tre aPackage.appletFile.class.

Note La localisation de ce chier est relative lURL de base du chier HTML de chargement de lapplet.

width=pixels height=pixels - Ces attributs obligatoires fournissent la largeur et la hauteur initiales (en pixels) de la zone dafchage de lapplet, sans compter les ventuelles fentres ou botes de dialogue afches par lApplet. codebase=codebaseURL - Cet attribut facultatif indique lURL de base de lapplet : le rpertoire contenant le code de lapplet. Si cet attribut nest pas prcis, cest lURL du document qui est utilis. name=appletInstanceName -- Cet attribut, facultatif, fournit un nom pour linstance de lapplet et permet de ce fait aux applets situes sur la mme page de se rechercher mutuellement (et de communiquer entre-elles). archive=ListeArchives permet de spcier une liste de chiers archive .jar contenant les classes excutables et, ventuellement des ressources. Les noms des archives sont spars par des virgules. object=objectFile.ser permet de spcier une instance dobjet charger.

-- Ces lments permettent de spcier un paramtre lapplet. Les applets accdent leurs paramtres par la mthode getParameter().

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/14Rvision : F-beta Date : 18/2/99

1Applets: protocolesLes changes HTTP correspondant une demande dApplet : serveur demande de document HTML demande de document applet ........ application/java navigateur

Les APIs entre lApplet et son environnement : ressource code Java

navigateur

notications cycle de vie Applet chargement de code au travers du rseau

demandes de ressources rafraichissements graphiques

systme de fentrage local

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/15Rvision : F-beta Date : 18/2/99

1Applets: protocolesUne Applet hrite de la classe java.applet.Applet qui, elle mme, drive de java.awt.Panel qui dcrit un panneau graphique (ceci dit une Applet nest pas ncessairement un objet graphique). Ce qui caractrise le programme qui sexcute en tant quApplet est quil na pas de point dentre (main), quil est charg et lanc par le navigateur et que ses interactions potentielles avec lenvironnement se font selon trois catgories dAPIs:

Les mthodes qui dcrivent le cycle de vie de lApplet. init(), start(), stop(), destroy() Ces mthodes sont appeles par le navigateur pour notier lApplet certains venements comme linitialisation de lApplet, liconisation de la page HTML hte, etc. Par dfaut ces mthodes ne font rien et il faut en rednir certaines dentre elles pour obtenir un comportement de lApplet. Les mthodes qui permettent lApplet dobtenir du navigateur des informations sur la page HMTL courante, ou dobtenir la recherche et le chargement de ressources (distantes). Les mthodes qui sont appeles par le systme graphique pour la notication de demande de rafrachissement dune zone de lcran: repaint(), update(Graphics), paint(Graphics) La rednition ventuelle de certaines de ces mthodes permet lApplet dagir, un bas niveau, sur son aspect graphique.

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/16Rvision : F-beta Date : 18/2/99

1Applets : cycle de vieinit() : Cette mthode est appele au moment o lapplet est cre et charge pour la premire fois dans un navigateur activ par Java (comme AppletViewer). Lapplet peut utiliser cette mthode pour initialiser les valeurs des donnes. Cette mthode nest pas appele chaque fois que le navigateur ouvre la page contenant lapplet, mais seulement la premire fois juste aprs le changement de lapplet. La mthode start() est appele pour indiquer que lapplet doit tre "active". Cette situation se produit au dmarrage de lapplet, une fois la mthode init() termine. Elle se produit galement lorsque le navigateur est restaur aprs avoir t iconis ou lorsque la page qui lhberge redevient la page courante du navigateur. Cela signie que lapplet peut utiliser cette mthode pour effectuer des tches comme dmarrer une animation ou jouer des sons. public void start() { musicClip.play(); } La mthode stop() est appele lorsque lapplet cesse de "vivre". Cette situation se produit lorsque le navigateur est icnis ou lorsque le navigateur prsente une autre page que la page courante. Lapplet peut utiliser cette mthode pour effectuer des tches telles que larrt dune animation. public void stop() { musicClip.stop(); } Les mthodes start() et stop() forment en fait une paire, de sorte que start() peut servir dclencher un comportement dans lapplet et stop() dsactiver ce comportement.

destroy() : Cette mthode est appele avant que lobjet applet ne soit dtruit c.a.d enlev du cache du navigateur.

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/17Rvision : F-beta Date : 18/2/99

1Applets : demandes au navigateurLapplet peut demander des ressources (gnralement situes sur le rseau). Ces ressources sont dsignes par des URLs (classe java.net.URL). Deux URL de rfrence sont importantes :

lURL du document HTML qui contient la description de la page courante. Cette URL est obtenue par getDocumentBase() . lURL du code racine de lApplet (celui qui est dcrit par lattribut code). Cette URL est obtenue par getCodeBase() .

En utilisant une de ces URLs comme point de base on peut demander des ressources comme des images ou des sons :

getImage(URL base, String dsignation) : permet daller rechercher une image, rend une instance de la classe Image. getAudioClip(URL base, String dsignation) : permet daller rechercher un son, rend une instance de la classe AudioClip.

Les dsignations de ressource par rapport une URL de base peuvent comprendre des cheminoms relatifs (par ex: ../../images/truc.gif). Attention toutefois : certains systmes nautorisent pas des remontes dans la hirarchie des rpertoires. Le moteur son de la plateforme Java2 sait traiter des chiers .wav, .aiff et .au ainsi que des ressource MIDI. Une nouvelle mthode newAudioClip(URL) permet de charger un AudioClip.

La mthode getParameter(String nom) permet de rcuprer, dans le chier source HTML de la page courante, la valeur dun des lments de lapplet courante, dcrit par une balise et ayant lattribut name=nom . Cette valeur est une chane String.

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/18Rvision : F-beta Date : 18/2/99

1Applets : demandes du systme de fentrageLes mises jour du systme graphique de bas niveau :

repaint()

Thread AWT (attente) Exposition

update(Graphics) :effacer zone appeler paint(Graphics)

paint(Graphics)

repaint() : demande de rafraichissement de la zone graphique. Cette demande est asynchrone et appelle update(Graphics). Linstance de java.awt.Graphics donne un contexte graphique qui permet aux mthodes de dessin doprer. update(Graphics) : par dfaut efface la zone et appelle paint(Graphics). Cette mthode peut-tre rednie pour viter des papillotements de lafchage (sries deffacement/dessin). paint(Graphics) : la rednition de cette mthode permet de dcrire des procdures logiques de (re)construction des dessins lmentaires qui constituent la prsentation graphique. Lorsque lon utilise des composants graphiques de haut niveau il nest souvent pas ncessaire dintervenir et le systme AWT gre automatiquement ces (re)afchages.

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/19Rvision : F-beta Date : 18/2/99

1Applets : exemple// Suppose lexistence de "sounds/cuckoo.au" // partir du rpertoire du fichier HTML dorigine import java.awt.Graphics; import java.applet.*; public class HwLoop extends Applet { AudioClip sound; public void init() { sound = getAudioClip(getDocumentBase(), "sounds/cuckoo.au"); } public void paint(Graphics gr) { // mthode de dessin de java.awt.Graphics gr.drawString("Audio Test", 25, 25); } public void start () { sound.loop(); } public void stop() { sound.stop(); } }

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/20Rvision : F-beta Date : 18/2/99

1Applets : utilisation darchives JarChaque fois quune Applet a besoin du code dune autre classe situe sur le site serveur ou chaque fois quelle a besoin de charger une ressource il y a une transaction HTTP entre le navigateur et le serveur. Il peut savrer ncessaire de diminuer ce nombre de transactions en regroupant lensemble de ces ressources dans une (ou plusieurs) archives jar. Les archives Jar permettent de regrouper dans un chier compress (format ZIP) un ensemble de rpertoires. Des meta-informations sont prsentes dans un chier Manifest. Cration dune archive partir du rpertoire repClasses et contenant tout le package fr.acme.applets jar cvf MesApplets.jar -C repClasses fr/acme/applets Mise jour du contenu avec les ressources du rpertoire images jar uvf MesApplets.jar images Larchive Jar contiendra alors sous sa racine :

le rpertoire fr (sous lequel se trouvent les codes des classes) le rpertoire images (qui contient les images) le repertoire META-INF (qui contient les meta-informations sur les ressources contenues dans le jar: chier MANIFEST.MF .

Pour connatre le contenu dun jar : jar tvf MesApplets.jar

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/21Rvision : F-beta Date : 18/2/99

1Applets : Ressources dans une archive JarPour exploiter larchive Jar gnre dans lexemple prcdent : Extrait du HTML : Code java de MonApplet: Image im ; public void init() { Class maClasse = this.getClass() ; // ou fr.acme.applets.MonApplet.class im = getImage(maClasse.getResource( getParameter(image1))); } public void paint(Graphics gr) { gr.drawImage(im,0,0,this) ; }

La mthode getResource sadresse au ClassLoader qui a charg la classe courante pour obtenir lURL dune ressource.

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/22Rvision : F-beta Date : 18/2/99

1Le systme de scurit de JavaSauf indication contraire de lutilisateur du navigateur une Applet est considre comme non able et ne peut :

obtenir des informations sur lenvironnement local (nom de lutilisateur, rpertoire daccueil, etc.). Seules des informations sur le type de systme et de JVM sont accessibles. connatre ou ouvrir des chiers dans le systme local, lancer des tches locales. obtenir une connexion sur le rseau avec une adresse autre que celle du site dorigine de la page HTML (une Applet peut donc ouvrir une connexion avec son hte dorigine).

La classe AccessControler est charge des contrles de scurit. Il est possible de modier les droits daccs en dnissant une politique de scurit. Les droits sont accords des codes (en les dsignant par leur URL) et sont dcrits dans des ressources locales. Exemple de politique de $JAVA_HOME/lib/security/java.policy : site dans chier

grant codeBase "file:${java.home}/lib/ext/-" { permission java.security.AllPermission; }; //illustre les droits des extensions installes Politique propre un utilisateur dans $HOME/.java.policy: grant codeBase http://www.acme.fr { permission java.io.FilePermission /tmp/*,read ; }

Attention : la notation de codeBase est celle dune URL (avec sparateur /), la notation du nom de chier dans FilePermission est locale au systme (utiliser la variable ${/} pour avoir un sparateur portable)

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/23Rvision : F-beta Date : 18/2/99

1Applications autonomes: scuritIl est possible de dclencher les contrles de scurit sur une application autonome en la lanant avec un SecurityManager: java -Djava.security.manager MonApplication Dans le CLASSPATH la scurit distingue les classes systme ables (proprit java.sys.class.path) des autres classes soumises aux contrles de scurit (proprit java.class.path). Ds quune application autonome met en oeuvre un SecurityManager il est vivement conseill de personnaliser la politique de scurit qui sapplique spciquement cette application. On peut passer un chier de description de politique de scurit au lancement dune application : java -Djava.security.policy=monfichier.policy MonApplication Les descriptions contenues dans le chier monchier.policy compltent alors la politique de scurit courante. Il est galement possible de rednir (et remplacer) compltement la politique courante en utilisant une autre syntaxe : java -Djava.security.policy==total.policy MonApplication

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/24Rvision : F-beta Date : 18/2/99

1Applications autonomes : archives JarPar ailleurs il est galement possible de mettre une application autonome dans un chier jar. Il faut crer le chier jar en initialisant lentre MainClass du chier Manifest. Exemple : soit le chier monManifeste : Main-Class: fr.acme.MonApplication

Cration du chier jar : jar cvfm appli.jar monManifeste -C classes fr/acme Lancement de lapplication (ici sans gestionnaire de scurit): java -jar appli.jar

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/25Rvision : F-beta Date : 18/2/99

1Approfondissements* Pour les oprations graphiques de bas niveau voir :

Lutilisation de la Classe java.awt.MediaTracker. Le chargement des images (par exemple) se fait de manire asynchrone. Si, pour manipuler des images, on a besoin dattendre leur chargement complet, utiliser un MediaTracker. Les classes java.awt.Graphics et java.awt.Graphics2D Notre sminaire java media (SL-053)

* Pour plus dinformations sur les archives JAR voir la documentation dans docs/guide/jar/index.html. Pour des oprations sur ces chiers voir le package java.util.jar ( approfondir aprs mairise des mcanismes dentre/sortie) * Pour des approfondissemnts sur la scurit et en particulier sur la signature des archives Jar voir docs/guide/security/index.html, voir galement nos cours SL-051 et SL-303.

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/26Rvision : F-beta Date : 18/2/99

1

Applets (rappels), archives jarIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

1/27Rvision : F-beta Date : 18/2/99

Le package AWT (rappels), LayoutManagerspoints essentiels

2

Le package AWT concerne les services du terminal virtuel portable:

Les composants AWT sappuient sur des services natifs du systme de fentrage local. Ainsi par exemple un Button (bouton) correspondra un composant natif bouton-Motif, boutonWindows, etc. Un autre package (Swing) permet de disposer de composants graphiques 100% pur java. Les composants principaux sont des Components; certains dentre eux sont aussi des Containers, cest dire des composants qui peuvent en contenir dautres. La disposition des Components lintrieur des Containers est sous le contrle de gestionnaires de disposition (LayoutManager).

Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Rvision : F-beta Date : 18/2/99

2Accs aux manipulations graphiques

Button

Le package AWT (rappels), LayoutManagersIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

2/29Rvision : F-beta Date : 18/2/99

2Accs au manipulations graphiquesLe package AWTLe package AWT fournit les objets pour accder aux services du terminal virtuel portable. Une notion fondamentale dans ce package est la hirarchie Component (un objet graphique) et Container (driv du prcdent: on peut disposer plusieurs Components DANS un Container) Exemples de Container : Frame (une fentre), Panel (un "panneau") et son driv particulier quest lApplet. Exemples de Component: Button, Label (un tiquette), TextField (une zone de saisie Texte), Canvas (zone de dessin graphique).

Le package AWT (rappels), LayoutManagersIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

2/30Rvision : F-beta Date : 18/2/99

2Les gestionnaires de Disposition (LayoutManager)Un des points forts de JAVA est de permettre de faire excuter le mme programme sur des plateformes diffrentes sans en modier le code. Pour les interactions graphiques une des consquences de cette situation est quun mme programme va devoir safcher sur des crans ayant des caractristiques trs diffrentes. On ne peut donc raisonnablement sappuyer sur un positionnement des composants en absolu (avec des coordonnes X et Y xes). La disposition relative des diffrents composants lintrieur dun Container sera prise en charge par un "gestionnaire de disposition" attach ce container. Ce LayoutManager va savoir grer les positions des composants en fonctions des dformations subies par le Container correspondant. A chaque Container est associ une liste des composants contenus. Attention une instance de composant ne peut tre dispose qu UN SEUL endroit (il ne sert rien de faire plusieurs oprations add() avec le mme composant -sauf si on veut explicitement le faire changer de zone dafchage-)

Le package AWT (rappels), LayoutManagersIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

2/31Rvision : F-beta Date : 18/2/99

2FlowLayout :FlowLayout : dispose les composants "en ligne". Cest le gestionnaire par dfaut des Panels. exemple de FlowLayout

La disposition se fait par une srie dappels add(Component) (lordre des appels est important puisquil dtermine les positions relatives des composants) panneau.add(new Button("bouton 1")) ; panneau.add(new Button("bouton 2")) ;

Le package AWT (rappels), LayoutManagersIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

2/32Rvision : F-beta Date : 18/2/99

2BorderLayout :BorderLayout : dispose des zones dans des points cardinaux autour dune zone centrale qui tend occuper la plus large place possible. Cest le gestionnaire par dfaut des Frames. Exemple de BorderLayout :

retaillage de fentre Les appels add() sont qualis (on dsigne lemplacement dans le zonage particulier au gestionnaire). Les composants ajouts sont souvent des Containers ayant eux-mme leur propre gestionnaire de disposition. Exemple: Panel panCentral = new Panel() ; Panel panBas = new Panel() ; fentre.add(panCentral, BorderLayout.CENTER); fentre.add(panBas, BorderLayout.SOUTH); // le panneau bas a son propre gestionnaire panbas.add(new Button (OK)) ;

Le package AWT (rappels), LayoutManagersIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

2/33Rvision : F-beta Date : 18/2/99

2GridLayout :Gridlayout : permet de disposer des composants dans une grille. Toutes les cellules de la grille prennent la mme taille et contraignent les composants quelles contiennent se dformer.

retaillage de fentre

On peut utiliser deux constructeurs diffrents par ex : setLayout(new GridLayout(int rows, int cols); ou setLayout(new GridLayout( int rows, int cols, int hgap, int vgap); Lordre des appels add() est important puisquil dtermine les positions relatives des composants : fentre.setLayout(new GridLayout(0,2)) ; fentre.add(new Button(1)) ;// position 0 0 fentre.add(newButton(2)) ; // position 0 1 fentre.add(new Button(3)) ;// position 1 0 ...

Le package AWT (rappels), LayoutManagersIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

2/34Rvision : F-beta Date : 18/2/99

2CardLayout :CardLayout : permet de disposer des composants dans une "pile" seul le composant du dessus est visible et on dispose de mthodes spciales pour faire passer un composant particulier sur le "dessus" de la pile.

Il faut crire un programme permettant de passer dun panneau lautre...

Les appels add() sont qualis (on donne dynamiquement un nom au niveau occup par le composant, ce nom sera utilis pour rechercher ultrieurement ce niveau). Les composants ajouts sont souvent des Containers ayant eux-mme leur propre gestionnaire de disposition. CardLayout cartes = new CardLayout() ; fen.setLayout(cartes); fen.add(panel1, Un) ; fen.add(panel2,Deux) ; .... cartes.show(fen,Un) ;

;

Le package AWT (rappels), LayoutManagersIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

2/35Rvision : F-beta Date : 18/2/99

2GridBagLayout :GridBagLayout : dispose les composants lintrieur des "cellules" dune table. Chaque ligne ou colonne de la table peut avoir des dimensions diffrentes de celles des autres lignes ou colonnes (quadrillage irrgulier).

Les paramtres controlant la mise en place dun composant particulier sont dcrits par une instance de la classe GridBagConstraints (on peut utiliser sans risque la mme instance pour plusieurs composants) a. gridx, gridy : donne les coordonnes x, y de lobjet dans la grille (celle-ci dduit automatiquement son propre nombre de lignes et de colonnes) b. gridwidth, gridheight : nombre de cellules occupes par le composant c. ll : direction du remplissage (le composant tend alors occuper toute sa cellule dans la direction donne). Valeurs: NONE, BOTH, VERTICAL, HORIZONTAL d. anchor: lorsquun composant est plus petit que sa cellule, bord dancrage du composant (un point cardinal: EAST, NORTHEAST, etc..) e. insets: dtermination des "gouttires" (distance minimum entre le composant et les frontires de sa cellule) f. weightx,weighty : "poids" relatif de la cellule (valeur de type double comprise entre 0 et 1)

Le package AWT (rappels), LayoutManagersIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

2/36Rvision : F-beta Date : 18/2/99

2g. ipadx, ipady : Signale le remplissage interne, savoir la quantit ajouter la taille minimale du composant. La largeur minimale du composant est la somme de la largeur minimale et de ipadx*2 pixels (puisque le remplissage sapplique dans les deux sens). Dans la mme logique, la hauteur minimale du composant est la somme de la hauteur minimale et de ipady*2 pixel

// on a un tableau a deux dimensions comprenant des composants Component[][] tb = { {...}, {...}, ... } ; this.setLayout(new GridBagLayout()) ; GridBagConstraints gbc = new GridBagConstraints (0,0, 1,1, // x,y, w, h 1.0, 1.0, // weightx,y GridBagConstraints.WEST , //anchor GridBagConstraints.NONE , //fill new Insets(3,5,3,5) , 0,0 ); //ipadx, ipady for (int iy = 0 ; iy 100 millimes de seconde. Chaque caractre pouss est report sur la console.

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/93Rvision : F-beta Date : 18/2/99

6Pour assembler le toutConsommateurLe thread consommateur excute la mthode dcrite ci-dessous : public void run() { char c; for (int i = 0; i < 20; i++) { c = theStack.pop(); System.out.println( "Consumed: "+ c); try { Thread.sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) { // ignore it.. } } } Par ce biais, 20 caractres sont recueillis partir de la pile, accusant un retard entre 0 et 2 secondes entre chaque essai. Il en dcoule une lenteur plus marque lors du processus de vidage en comparaison avec le remplissage. Nous allons prsent nous pencher sur la construction de la classe pile. Il nous faut un index et une table tampon qui ne devrait pas tre trop grande, parce que le but de cet exercice est davoir une opration et une synchronisation correctes lors du remplissage. Nous allons prendre une table de 6 caractres.

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/94Rvision : F-beta Date : 18/2/99

6Pour assembler le toutClasse SyncStackUne classe SyncStack nouvellement cre est normalement vide, ce qui peut aisment tre arrang au moyen de linitialisation par dfaut des valeurs, mais qui sera dtaill de faon explicite pour tre plus clair. Nous pouvons entamer la construction de notre classe : class SyncStack { private int index = 0; private char [] buffer = new char[6]; public synchronized char pop() { } public synchronized void push(char c) { } } Vous aurez remarqu labsence de tout constructeur. Il serait peut-tre prfrable dinclure this pour des raisons de style, mais, brivet oblige, nous nous sommes permis de lomettre.

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/95Rvision : F-beta Date : 18/2/99

6Pour assembler le toutClasse SyncStack (suite)Analyse de push() et pop()Au tour des mthodes push et pop dtre au coeur de notre analyse. Nous devons appliquer le mcanisme synchronized pour protger les donnes fragiles telles que les lments tampon et lindex. Par ailleurs, nous devons appeler wait() si la mthode ne fonctionne pas, puis notify() pendant la ralisation de notre travail. Voici laspect que revt la mthode push() : public synchronized void push(char c) { while (index == buffer.length) { try { this.wait(); } catch (InterruptedException e) { // ignore it.. } } this.notify(); buffer[index] = c; index++; }

Notez que lappel wait() est en fait this.wait(). La redondance nest pas vaine, elle permet de veiller ce que le rendez-vous ait bien lieu sur lobjet this. Lappel wait() est plac sur une construction try/catch. compte tenu de la suspension de lappel wait() par la mthode interrupt(), il faut boucler notre texte au cas o le thread serait activ prmaturment par lappel wait(). Examinons maintenant lappel notify() qui est en ralit this.notify(). Malgr la redondance, il a le mrite dtre univoque. Lappel notify() est lanc avant lavnement de la modication. Malgr les apparences, il ne sagit pas dune erreur. Tout thread en tat de sommeil ne peut poursuivre son activit tant quil nest pas sorti du bloc synchronis. Nous pouvons, par consquent, mettre lappel notify() aussitt que nous savons que nous allons pouvoir aller de lavant avec les changements que cela implique.

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/96Rvision : F-beta Date : 18/2/99

6Pour assembler le toutClasse SyncStack (suite)Il ne nous reste plus qu voir comment il faut grer les erreurs. Vous aurez remarqu quil nexiste pas de code explicite pour viter le dbordement. Ceci nest pas ncessaire, puisque seule la mthode "this", qui entre dans ltat wait(), permet dinsrer un lment dans notre pile et provoquer un dbordement. Il est donc inutile de dtecter des erreurs. Par ailleurs, nous pouvons vouer une conance aveugle la mthode "this" dans le cadre dun systme dexploitation. Et pour cause, si notre logique savre dfectueuse, nous allons nous retrouver en manque daccs tables en dehors des limites autorises, ce qui entranera sur le champ lavertissement Exception et lerreur ne passera pas inaperue. Pour couvrir dautres cas, vous pouvez utiliser lexception Runtime pour placer vos propres contrles. Il en va de mme pour la mthode pop() : public synchronized char pop() { while (index == 0) { try { this.wait(); } catch (InterruptedException e) { // ignore it.. } } this.notify(); index--; return buffer[index]; } Il ne nous reste plus qu mettre ces fragments dans des classes compltes et ajouter un cadre pour les rendre excutables. Le code nal est illustr dans les pages suivantes.

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/97Rvision : F-beta Date : 18/2/99

6Classe SyncStackSyncTest.javapackage mod13; public class SyncTest { public static void main(String args[]) { SyncStack stack = new SyncStack(); Runnable source = new Producer(stack); Runnable sink = new Consumer(stack); Thread t1 = new Thread(source); Thread t2 = new Thread(sink); t1.start(); t2.start(); } }

Producer.javapackage mod13; public class Producer implements Runnable { SyncStack theStack; public Producer(SyncStack s) { theStack = s; } public void run() { char c; for (int i = 0; i < 20; i++) { c = (char)(Math.random() * 26 + 'A'); theStack.push(c); System.out.println("Produced: " + c); try { Thread.sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { // ignore it.. } } } }Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/98Rvision : F-beta Date : 18/2/99

6Classe SyncStackConsumer.javapackage mod13; public class Consumer implements Runnable { SyncStack theStack; public Consumer(SyncStack s) { theStack = s; } public void run() { char c; for (int i = 0; i < 20; i++) { c = theStack.pop(); System.out.println("Consumed: " + c); try { Thread.sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) { // ignore it.. } } } }

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/99Rvision : F-beta Date : 18/2/99

6Classe SyncStackSyncStack.javapackage mod13; public class SyncStack { private int index = 0; private char [] buffer = new char[6]; public synchronized char pop() { while (index == 0) { try { this.wait(); } catch (InterruptedException e) { // ignore it.. } } this.notify(); index--; return buffer[index]; } public synchronized void push(char c) { while (index == buffer.length) { try { this.wait(); } catch (InterruptedException e) { // ignore it.. } } this.notify(); buffer[index] = c; index++; } }

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/100Rvision : F-beta Date : 18/2/99

6Etats dun Thread (rsum)

En Attente

n attente interruption

sleep()/join()

new

start()

Ordonnanceur Eligible yield() Actif

mort

le attente BLOC SYNCHRONIZED wait()

notify() notifyAll()

autre processus actif Remarques : 1) Dans un bloc synchronized le processus peut tre actif ou prempt par lordonnanceur . 2) Lorsque un processus reoit un notify() il nest pas forcment ractiv immdiatement: il peut avoir attendre quun autre processus relache le verrou sur lobjet synchronis courant.

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/101Rvision : F-beta Date : 18/2/99

6Approfondissements* Les mthodes de thread suspend() et resume() etant obsolete on peut chercher un moyen pour permettre un thread de rpondre une demande de suspension.

public class ControlledThread extends Thread { static final int SUSP = 1; static final int STOP = 2; static final int RUN = 0; private int state = RUN; public synchronized void setState(int s) { state = s; if ( s == RUN ) {//corriger si s==STOP et state==SUSP notify(); } } public synchronized boolean checkState() { while ( state == SUSP ) { try { wait(); } catch (InterruptedException e) { // ignore } } if ( state == STOP ) { return false; } return true; } public void run() { while ( true ) { doSomething(); // // // if } } } } Be sure shared data is in consistent state in case the thread is waited or marked for exiting from run() ( !checkState() ) { break;

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/102Rvision : F-beta Date : 18/2/99

6

Accs concurrentsIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

6/103Rvision : F-beta Date : 18/2/99

Principes des Entres/SortiesPoints essentiels :

7

Java offre une vision des entre/sorties portables bases sur la notion de ot (Stream).

Il existe deux catgories de ots de base : les ots doctets (InputStream, OutputStream) et les ots de caractres (Reader, Writer). Certains ots sont associs des ressources qui fournissent des donnes (chiers, tableaux en mmoire, lignes de communications,...) Dautres types de ots transforment la manire dont on opre sur les donnes en transit (E/S bufferise, traduction de donnes, etc.) Cest en combinant les services de ces diffrents types de ot que lon contrle les oprations dentres/sorties.

Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Rvision : F-beta Date : 18/2/99

7Fots E/S avec JavaDans ce module, nous allons examiner comment le langage Java gre les Entres/Sorties (y compris sur stdin, stdout et stderr) par le biais de ots (Stream). Par la suite, nous approfondirons le maniement des chiers et des donnes qui sy trouvent.

Les fondements de la notion de otUn ot est soit une source doctets, soit une destination pour les octets. Lordre est important. Par exemple, un programme souhaitant lire partir dun clavier peut se servir dun ot pour mener bien cette action. Il existe deux catgories fondamentales de ots, savoir les ots dentre, partir desquels on peut lire et les ots de sortie qui, au contraire, acceptent lcriture mais ne peuvent tre lus. Dans le package java.io, certains ots ont pour origine une ressource, ils peuvent lire ou crire dans ressource dtermine telle quun chier ou une zone mmoire. Dautres ots sont appels ltres. Un ltre dentre est cr moyennant une connexion un ot dentre existant, de sorte que, lorsque vous tentez de lire partir du ltre dentre, vous obteniez les donnes extraites, lorigine, sur cet autre ot dentre.

w o l l e

o

r

l

d

Sens du "ot" doctets

lecture() h

Ressource InputStream p. ex. du chier du disque

Filtre InputStream

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/105Rvision : F-beta Date : 18/2/99

7Flots E/S avec JavaMthodes InputStreamint read() int read(byte[]) int read(byte[], int, int) Ces trois mthodes fournissent des octets. La mthode read renvoie un argument int contenant un octet lu partir du ot ou la valeur -1 indiquant la n de chier. Les deux mthodes restantes remplissent une table doctets avec des octets lus et en renvoient le nombre. Les deux arguments int de la troisime mthode indiquent un sous-ensemble de la table cible.

Pour proter dune efcacit optimale, lisez toujours les donnes par blocs les plus grands possible.

void close() Il est recommand de fermer un ot lorsque vous avez ni de lutiliser. int available() Cette instruction signale le nombre doctets prts tre lus dans le ot. Une opration de lecture relle succdant cet appel peut ventuellement renvoyer plus doctets. skip(long) Cette mthode permet de sauter un nombre dtermin doctets provenant du ot.

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/106Rvision : F-beta Date : 18/2/99

7Flots E/S avec JavaMthodes InputStream (suite)markSupported() mark(int) reset() Ces mthodes visent effectuer des oprations de "rejet" sur un ot condition que celui-ci les prenne en charge. La mthode markSupported() renvoie true si les mthodes mark() et reset() sont oprationnelles dans le cadre de ce ot spcique. La mthode mark(int) sert indiquer que le point courant dans le ot devrait tre not et quil faudrait affecter une quantit sufsante de mmoire tampon, dans le but dadmettre au moins le nombre de caractres de largument donn. A la suite doprations read()successives, la mthode reset() tend repositionner le ot dentre sur le premier point mmoris.

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/107Rvision : F-beta Date : 18/2/99

7Flots E/S avec JavaMthodes OutputStreamwrite(int) write(byte[]) write(byte[], int, int) Ces mthodes crivent dans le ot de sortie. A linstar des ots dentre, il est recommand dcrire les donnes par blocs les plus grands possibles. close() Il est prfrable de fermer les ots de sortie aprs avoir termin de les utiliser. flush() Il arrive parfois que le ot de sortie tamponne les critures avant de les crire rellement. La mthode flush() vous donne les moyens de purger les buffers..

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/108Rvision : F-beta Date : 18/2/99

7Streams de baseDe manire simplifie voici comment se prsente la hirarchie au sein du package java.io InputStream SequenceInputStream PipedInputStream FilterInputStream . . . FileInputStream ByteArrayInputStream

DataInputStream PushbackInputStream

. . . BufferedInputStream

FileInputStream et FileOutputStreamIl sagit de classes mettant en jeu des ots issus de ressources et, comme leur nom lindique, elles utilisent des chiers disque. Les constructeurs de ces classes vous permettent de prciser le chemin daccs du chier auquel elles sont connectes. La construction dune classe FileInputStream est conditionne par lexistence du chier associ et par son accs en lecture. Lors de la construction dune classe FileOutputStream, le chier de sortie, sil existe encore, est cras. FileInputStream infile = new FileInputStream("myfile.dat"); FileOutputStream outfile = new FileOutputStream("results.dat"); .

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/109Rvision : F-beta Date : 18/2/99

7Classes Stream de baseBufferedInputStream et BufferedOuUtputStreamCes ltres permettent de bufferiser les dE/S et donc de les optimiser.

DataInputStream et DataOutputStreamCes ltres permettent la lecture et lcriture de types de base Java au moyen de ots. Voici une palette de mthodes spciales pour les types de base :

Mthodes DataInputStreambyte readByte() long readLong() double readDouble()

Mthodes DataOutputStreamvoid writeByte(byte) void writeLong(long) void writeDouble(double) Notez que les mthodes de DataInputStream vont de pair avec les mthodes de DataOutputStream.

PipedInputStream et PipedOutputStreamLes tubes de communication (piped streams) servent de pont de communication entre threads. Un objet PipedInputStream dans un thread reoit ses donnes en entre partir dun objet PipedOutputStream complmentaire situ dans un autre thread. .

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/110Rvision : F-beta Date : 18/2/99

7Flots dentre sur URLEn sus de laccs de chiers de base, Java est munie dURL (Uniform Resource Locators) destines accder des objets via un rseau. Vous utilisez un objet URL lorsque vous accdez aux sons et images laide de la mthode getDocumentBase() pour des applets : String imageFile = new String ("images/Duke/T1.gif"); images[0] = getImage(getDocumentBase(), imageFile); Vous pouvez toutefois fournir un URL directement comme suit : java.net.URL imageSource; try { imageSource = new URL("http://mysite.com/~info"); } catch (MalformedURLException e) {} images[0] = getImage(imageSource, "Duke/T1.gif");

Pour ouvrir un ot dentreEn outre, vous pouvez ouvrir un ot dentre partir dune URL : InputStream is; String datafile = new String("Data/data.1-96"); byte buffer[] = new byte[24]; try { // new URL throws a MalformedURLException // URL.openStream() throws an IOException is = (new URL(getDocumentBase(), datafile)).openStream(); } catch (Exception e) {} A prsent, vous tes en mesure dutiliser is pour lire les informations, : try { is.read(buffer, 0, buffer.length); } catch (IOException e1) {}

Noubliez pas que la plupart des utilisateurs ont une politique de scurit visant empcher les applets daccder aux chiers.

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/111Rvision : F-beta Date : 18/2/99

7Readers et WritersUnicodeEn interne Java utilise le format Unicode, comme ces caractres sont reprsents sur 16 bits on est oblig dutiliser des ots spciaux pour les manipuler: ce sont les Reader et les Writer. Les classes InputStreamReader et OutputStreamWriter font le pont avec les ots doctets en assurant de manire implicite ou explicite les conversions ncessaires.

Octet Conversion de caractresPar dfaut, si vous construisez simplement un Reader ou un Writer connect un ot, les rgles de conversion qui sappliquent sont celles entre le codage de la plateforme locale et Unicode. Dans la plupart des pays europens utilisant les caractres "latins", lencodage des caractres suit la norme ISO 8859-1.(Cp1252 sous Windows). Vous pouvez slectionner un autre type de codage doctets, laide dune des listes regroupant les formes de codage reconnues que vous trouverez dans la documentation pour loutil native2ascii. Pour lire une entre partir dun codage de caractre non local ou mme la lire partir dune connexion rseau avec un type diffrent de machine, vous pouvez construire un InputStreamReader par le biais dun codage de caractres explicite comme suit : ir = new InputStreamReader(flotentree, "ISO8859_1")

Si vous lisez les caractres dune connexion rseau, nous vous enjoignons dutiliser cette formulation, faute de quoi votre programme sera toujours tent de convertir les caractres quil lit comme sil sagissait dune reprsentation locale, ce qui ne serait pas le reet de la ralit .

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/112Rvision : F-beta Date : 18/2/99

7Readers et WritersBufferedReader et BufferedWriterIl est prfrable denchaner un BufferedReader ou BufferedWriter, sur un InputStreamReader InputStreamWriter car la conversion entre formats donne rsultats plus probants lorsquelle est effectue par blocs. Noubliez dutiliser la mthode flush() sur un BufferedWriter. un ou des pas

Lecture de chane dentres. public class CharInput { public static void main(String args[]) { String s; InputStreamReader ir; BufferedReader in; ir = new InputStreamReader(System.in); in = new BufferedReader(ir); while ((s = in.readLine()) != null) { System.out.println("Read: " + s); } } }

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/113Rvision : F-beta Date : 18/2/99

7FichiersAvant de pouvoir appliquer E/S sur un chier, il vous faut obtenir linformation de base concernant ce chier. La classe File met disposition une srie dutilitaires permettant de travailler avec des chiers et dobtenir des informations leur sujet.

Pour crer un nouvel objet Filel l lFile myFile; myFile = new File("monfichier"); myFile = new File("repertoire", "monfichier"); // mieux si repertoire et/ou fichiers sont des vars File myDir = new File("repertoire"); myFile = new File(myDir, "monfichier");

Le constructeur que vous utilisez dpend souvent dautres objets chier auxquels vous accdez. Par exemple, si vous utilisez un chier dans votre application, utilisez le premier constructeur. En revanche, si vous utilisez plusieurs chiers provenant dun rpertoire commun, il est plus pratique de faire appel au second ou troisime constructeur. Un objet File peut faire ofce dargument de constructeur pour des objets FileInputStream et FileOutputStream. Vous prservez ainsi une indpendance vis--vis de la convention locale de notation de la hirarchie du systme de chiers.

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/114Rvision : F-beta Date : 18/2/99

7Tests de chiers et utilitairesUne fois un objet File cr, vous pouvez librement opter pour une des mthodes suivantes an de recueillir des information au sujet du chier :

Noms de chiers l l l l lString getName() String getPath() String getAbsolutePath() String getParent() boolean renameTo(File newName)

Tests de chiers l l l l l lboolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() boolean isAbsolute();

Information gnrale axe sur les chiers et utilitaires l l llong lastModified() long length() boolean delete()

Utilitaires en rapport avec les rpertoires l lboolean mkdir() String[] list()

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/115Rvision : F-beta Date : 18/2/99

7Fichiers accs directLe langage Java vous fournit une classe RandomAccessFile pour prendre en charge les chiers accs direct.

Pour crer un chier daccs directVous avez le choix entre deux options pour ouvrir un chier accs direct:

l

Par le nom du chier

myRAFile = new RandomAccessFile(String name, String mode);

l

Par un objet File

myRAFile = new RandomAccessFile(File file, String mode); Largument mode dtermine si vous disposez dun accs en lecture seule ("r") ou en lecture/criture ("rw"). Voici comment procder, lors de louverture dun chier base de donnes, en vue dune mise jour : RandomAccessFile myRAFile; myRAFile = new RandomAccessFile("stock.dbf","rw");

Pour accder linformationLes objets RandomAccessFile escomptent lire et crire les informations comme les ots dE/S donnes: vous pouvez accder toutes les oprations des classes DataInputStream et DataOutputStream.

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/116Rvision : F-beta Date : 18/2/99

7Fichiers accs directPour accder linformation (suite)Le langage Java propose diverses mthodes permettant de parcourir le chier :

l

long getFilePointer();

Renvoie la position courante du pointeur de chier.

l

void seek(long pos);

Fixe le pointeur de chier sur la position absolue indique qui est prcise par un dcalage doctets partant du dbut du chier. La position 0 marque le dbut du chier.

l

long length();

Renvoie la longueur du chier. La position length() marque la n du chier.

Pour insrer des informations: myRAFile = new RandomAccessFile("java.log","rw"); myRAFile.seek(myRAFile.length()); // Any subsequent write()s will be appended to the file

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/117Rvision : F-beta Date : 18/2/99

7Approfondissements* La lecture/criture dobjets sur les ots sera aborde dans un chapitre ultrieur (serialization) * Voir les packages java.util.zip et java.util.jar pour des utilitaires de compression ou daccs aux chiers Jar. * Voir galement dans java.io la classe StreamTokenizer (analyseur de texte)

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/118Rvision : F-beta Date : 18/2/99

7

Principes des Entres/SortiesIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

7/119Rvision : F-beta Date : 18/2/99

La programmation rseauPoints essentiels :

8

Le package java.net offre des services permettant des connexions directes au travers du rseau. Le paradigme de socket est utilis pour tablir des connexions.

communications sur TCP (ots) communications via UDP (datagrammes). datagrammes avec diffusion multiple (multicast).

Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Rvision : F-beta Date : 18/2/99

8Modles de connexions rseau en JavaAccs programmatiques aux sockets (canaux de communication bidirectionnels) sur TCP/IP SERVEUR

portdemand

CLIENTe de con nexion

SOCKET

Flots E/S

Programmation de Datagrammes UDP

Datagrammes avec MultiCast

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/121Rvision : F-beta Date : 18/2/99

8Programmation rseau en JavaSocketsLes Sockets sont des points dentre de communication bi-directionnelle entre deux applications sur un rseau. Les diffrents types de Socket conditionnent la faon dont les donnes vont tre transfres :

Stream sockets (TCP) Permettent dtablir une communication en mode connect. Un ot continu est tabli entre les deux correspondants : les donnes arrivent dans un ordre correct et sans tre corrompues. Datagram sockets (UDP) Permettent dtablir une connexion en mode non-connect, que lon appelle aussi mode Datagramme. Les donnes doivent tre assembles et envoyes sous la forme de paquets indpendants de toute connexion. Un service non connect est gnralement plus rapide quun servcie connect, mais il est aussi moins able : aucune garantie ne peut tre mise quand au fait que les paquets seront effectivement distribus correctement -ils peuvent tre perdus, dupliqus ou distribus dans le dsordre-.

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/122Rvision : F-beta Date : 18/2/99

8Le modle rseau de Java.Dans Java, les sockets TCP/IP sont implantes au travers de classes du package java.net. Voici la faon dont ces classes sont utilises. :

Serveur

ServerSocket (port #, nb_cnx) accept() retourne un objet Socket

Enregistrer ce service. Attendre une connexion du client. Utiliser la Socket

Client

Socket (host, port#)(attempt to connect)

InputStream OutputStream

OutputStream InputStream

close ()

close ()

Dans ce modle, le fonctionnement est le suivant :

Le Serveur enregistre son service sous un numro de port, indiquant le nombre de client quil accepte de faire patienter un instant T. Puis, le serveur se met en attente sur ce service par la mthode accept() de son instance de ServerSocket. Le client peut alors tablir une connexion avec le serveur en demandant la cration dune socket destination du serveur pour le port sur lequel le service a t enregistr. Le serveur sort de son accept() et rcupre une Socket en communication avec le Client. Ils peuvent alors utiliser des InputStream et OutputStream pour changer des donnes.La programmation rseau 8/123Rvision : F-beta Date : 18/2/99

Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8Principe dun Serveur TCP/IPExemple de code de mise en oeuvre dun serveur TCP/IPimport java.net.*; import java.io.*; public class Serveur { ServerSocket srv ; public Serveur( int port) throws IOException{ srv = new ServerSocket(port) ; } public void go() { while (true) { try { Socket sck = srv.accept() ; dialogue(sck.getInputStream(), sck.getOutputStream()); sck.close() ; } catch (IOException exc) { } } } public void dialogue(InputStream is, OutputStream os) throws IOException { DataOutputStream dos = new DataOutputStream(os) ; dos.writeUTF ("Hello net World") ; } public static void main (String[] args) throws Exception { Serveur serv = new Serveur(Integer.parseInt(args[0])) ; serv.go() ; } }

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/124Rvision : F-beta Date : 18/2/99

8Principe dun Client TCP/IPLe client correspondant : import java.net.*; import java.io.*; public class Client { Socket sck ; public Client( String host, int port) throws IOException{ sck = new Socket(host, port) ; } public void go() { try{ dialogue(sck.getInputStream(), sck.getOutputStream()) ; } catch (IOException exc) { } } public void stop() { try { sck.close() ; } catch (IOException exc) { } } public void dialogue(InputStream is, OutputStream os) throws IOException { DataInputStream dis = new DataInputStream(is) ; System.out.println(dis.readUTF()) ; } public static void main (String[] args) throws Exception { Client cli = new Client( args[0], Integer.parseInt(args[1])) ; cli.go() ; cli.stop() ; } }

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/125Rvision : F-beta Date : 18/2/99

8changes UDPOn na pas ici de connexion ouverte en permanence. Les paquets, autonomes, sont transfrs avec leur propres informations dadresse. Le service nest pas "able" car il y a des risques de perte, ou de duplication de paquets. Lordre darrive nest pas garanti. Pour limiter les incidents il vaut mieux limiter la taille des paquets envoys de manire ce quils noccupent quun seul paquet IP. Les objets fondamentaux :

DatagramSocket : dtermine un canal (socket) UDP. Pour un serveur on prcisera le port (pas ncessaire pour le client)

DatagramSocket serverSock = new DatagramSocket(9789); DatagramSocket clientSock= new DatagramSocket() ;

DatagramPacket : structure daccueil des donnes et des informations dadresse. Les methodes getData(), getAddress(), getPort() permettent de rcuprer ces informations.

// pour un envoi sendPack = new DatagramPacket(byteBuff, len, addr, port); socket.send(sendPack) ; // pour une reception revPack = new DatagramPacket(byteBuffer, len) ; socket.receive(recvPack);

InetAddress : permet de produire une adresse inet partir dune dsignation (mthode getByName()) ou de la machine locale (getLocalHost())

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/126Rvision : F-beta Date : 18/2/99

8Exemple de Serveur UDPCe serveur reoit un message dun client et le renvoie prcd dun autre message. On utilise les donnes dadressage du paquet reu du client pour reexpdier les donnes

import java.io.* ; import java.net.* ; import java.sql.* ; public class DatagServer { public static final int DATA_MAX_SIZE = 512 ; DatagramSocket veille ; public DatagServer( int port) throws IOException { veille = new DatagramSocket(port) ; }// public void go() { byte[] recBuffer = new byte[DATA_MAX_SIZE] ; while (true) { try { // ************* on ecoute DatagramPacket recvPack = new DatagramPacket(recBuffer, recBuffer.length) ; veille.receive(recvPack) ; // ************* on prepare les streams et on dialogue ByteArrayInputStream biz = new ByteArrayInputStream(recvPack.getData()) ; ByteArrayOutputStream boz = new ByteArrayOutputStream(); lireEcrire(biz,boz) ; // ************* on renvoie DatagramPacket sendPack = new DatagramPacket(boz.toByteArray(), boz.size(), recvPack.getAddress(), recvPack.getPort()) ; veille.send(sendPack) ; } catch (IOException exc) { } } } // goLa programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/127Rvision : F-beta Date : 18/2/99

8public void lireEcrire(InputStream is, OutputStream os) throws IOException { DataInputStream dis = new DataInputStream(is) ; String mess = dis.readUTF() ; System.out.println(mess) ; DataOutputStream dos = new DataOutputStream(os) ; dos.writeUTF("reu: " + mess ) ; }

public static void main (String[] args) throws Exception { DatagServer serv = new DatagServer(Integer.parseInt(args[0])) ; serv.go() ; }//End main }

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/128Rvision : F-beta Date : 18/2/99

8Exemple de client UDPCorrespond au serveur prcdent : on envoie un message et on le reoit en echo prcd de celui du serveur. import java.io.* ; import java.net.* ; import java.sql.* ; public class DatagClient { public static final int DATA_MAX_SIZE = 512 ; DatagramSocket sock ; InetAddress inetServ ; int port ; public DatagClient( String server, int sport ) throws IOException { sock = new DatagramSocket() ; inetServ= InetAddress.getByName(server) ; port = sport ; }// public void go() { byte[] recBuffer = new byte[DATA_MAX_SIZE] ; try { ByteArrayOutputStream boz = new ByteArrayOutputStream(); ecrire(boz) ; DatagramPacket sendPack = new DatagramPacket(boz.toByteArray(), boz.size(), inetServ, port) ; sock.send(sendPack) ; // ************* on ecoute DatagramPacket recvPack = new DatagramPacket(recBuffer, recBuffer.length) ; sock.receive(recvPack) ; // ************* on prepare les streams et on dialogue ByteArrayInputStream biz = new ByteArrayInputStream(recvPack.getData()) ; lire(biz) ; // ************* on renvoie } catch (IOException exc) { } } // go

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/129Rvision : F-beta Date : 18/2/99

8

public void ecrire( OutputStream os) throws IOException { DataOutputStream dos = new DataOutputStream(os) ; dos.writeUTF("bonjour") ; }

public void lire(InputStream is) throws IOException { DataInputStream dis = new DataInputStream(is) ; String mess = dis.readUTF() ; System.out.println(mess) ; } public static void main (String[] args) throws Exception { DatagClient cli = new DatagClient(args[0], Integer.parseInt(args[1])) ; cli.go() ; }//End main }

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/130Rvision : F-beta Date : 18/2/99

8UDP en diffusion (Multicast)Une adresse de diffusion (multicast) est une adresse comprise entre 224.0.0.0 et 239.255.255.255. Des MulticastSocket permettent de diffuser des donnes simultanment un groupe dabonns. Sur une telle socket on peut sabonner une adresse multicast par joinGroup(InetAddress mcastaddr) ou se dsabonner par leaveGroup(InetAddress). Le paramtre TTL de ces sockets permet de xer le nombre maximum de routeurs traverss - si ces routeurs le permettent- (important si on veut limiter la diffusion lextrieur dune entreprise)

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/131Rvision : F-beta Date : 18/2/99

8Exemple de Serveur MulticastDiffuse un java.sql.TimeStamp toute les secondes. Les paquets ne se transmettent pas au travers des relais rseaux (TTL = 1).1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import java.io.* ; import java.net.* ; import java.sql.* ; public class MultigServer { public static final int PORT = 9999 ; public static final String GROUP = "229.69.69.69" ; public static final byte TTL = 1 ; // pas de saut! public static final int DATA_MAX_SIZE = 512 ; public static void main (String[] tbArgs) { byte[] recBuffer = new byte[DATA_MAX_SIZE] ; try{ MulticastSocket veille = new MulticastSocket(PORT); InetAddress adrGroupe = InetAddress.getByName(GROUP) ; while (veille != null) { ByteArrayOutputStream boz = new ByteArrayOutputStream(); ObjectOutputStream oz = new ObjectOutputStream (boz) ; oz.writeObject(new Timestamp(System.currentTimeMillis())) ; // consommation excessive de donnes (deux byte buffers!) DatagramPacket sendPack = new DatagramPacket(boz.toByteArray(), boz.size(), adrgroupe, PORT) ; veille.send(sendPack, TTL) ; try{ Thread.sleep(1000) ; } catch (InterruptedException exc) {} } } catch (Exception exc ) { System.err.println(exc) ; } }//End main }

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/132Rvision : F-beta Date : 18/2/99

8Exemple de client MulticastReoit 10 objets du serveur1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 import java.io.* ; import java.net.* ; import java.sql.* ; public class MultigClient { public static final int DATA_MAX_SIZE = 512 ; public static void main (String[] tbArgs) { MulticastSocket socket = null; InetAddress adrGroupe = null ; byte[] recBuffer = new byte[DATA_MAX_SIZE] ; try{ socket = new MulticastSocket(MultigServer.PORT) ; adrGroupe = InetAddress.getByName(MultigServer.GROUP) ; if (socket != null) { socket.joinGroup(adrGroupe) ; // danger! on reutilise le meme buffer? DatagramPacket recvPack = new DatagramPacket(recBuffer, recBuffer.length) ; for( int ix = 0 ; ix < 10 ; ix++) { socket.receive(recvPack) ; ObjectInputStream inz = new ObjectInputStream (new ByteArrayInputStream( recvPack.getData())) ; Object obj = inz.readObject() ; System.out.println(obj) ; inz.close() ; }// for } } catch (Exception exc ) { System.err.println(exc) ; } finally { if ( socket != null) { try{ socket.leaveGroup(adrGroupe) ; } catch (IOException exc) {} } } } }

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/133Rvision : F-beta Date : 18/2/99

8Approfondissements* Voir dans le package les classes permetttant de manipuler et dutiliser des URL et en particulier URLConnection et ses drivs (HttpURLConnection, JarURLconnection,..). Dans le cas dchanges http voir galement la pratique des ContentHandler. * Voir les classes lies la scurit avance sur rseau (NetPermision, Authenticator,..), lutilisation de javax.net.ssl et de https. * Voir galement les mcanismes de personnalisation des sockets (SocketImplFactory) en particulier avec RMI.

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/134Rvision : F-beta Date : 18/2/99

8

La programmation rseauIntitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

8/135Rvision : F-beta Date : 18/2/99

Linarisation des objets (Serialization)Points essentiels :

9

Une catgorie particulire de classe dentre/sortie permet de lire ou dcrire des instance dobjets sur un ot :

ObjectInputStream et ObjectOutputStream particularits du comportement des Stream dobjets personnalisations des E/S dobjets.

Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

Rvision : F-beta Date : 18/2/99

9IntroductionLa majorit des applications requiert un outil de sauvegarde des donnes. La plupart de ces applications utilisent une base de donnes pour stocker ou conserver des donnes. Cependant, les bases de donnes ne servent pas uniquement stocker des objets, particulirement des objets Java. Pour les applications, le seul impratif est de conserver ltat dun objet Java an que cet objet puisse tre facilement stock et rcupr dans son tat initial . Dans cette optique, l API de linarisation dobjets Java fournit un moyen simple et transparent permettant de conserver les objets Java. Elle nest pas utilise uniquement pour sauvegarder ou restaurer des donnes mais sert aussi changer des objets sur des ots (par ex. changes dobjets entre JVM distantes)

Linarisation des objets (Serialization)Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

9/137Rvision : F-beta Date : 18/2/99

9Architecture de srialisationPackage java.ioLAPI de srialisation est base sur deux interfaces abstraites base de ots, java.io.ObjectOutput et java.io.ObjectInput, conues pour introduire ou extraire des objets dun ot dE/S.

java.io.DataOutput

java.io.OutputStream

ObjectOutput

ObjectOutputStream

ObjectStreamConstants

java.io.DataInput

java.io.InputStream

ObjectInput

ObjectInputStream

java.lang.Object

java.io.Serializable

Lgende Classe Classe abstraite Interface

java.io.Externalizable

Etend Implante

Linarisation des objets (Serialization)Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

9/138Rvision : F-beta Date : 18/2/99

9Architecture de srialisationInterface ObjectOutputLinterface ObjectOutput tend DataOutput an dcrire des primitives. La principale mthode de cette interface est writeObject() qui permet dcrire un objet. Des exceptions peuvent tre gnres lors de laccs lobjet ou ses champs, ou lors dune tentative dcriture dans le ot. package java.io; public interface ObjectOutput extends DataOutput { public void writeObject(Object obj) throws IOException; public void write(byte b[]) throws IOException; public void write(byte b[], int off, int len) throws IOException; public void flush() throws IOException; public void close() throws IOException; }

Linarisation des objets (Serialization)Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

9/139Rvision : F-beta Date : 18/2/99

9Architecture de srialisationInterface ObjectInputLa mthode readObject permet de lire le ot et de retourner un objet. Des exceptions sont gnres lors dune tentative de lecture du ot , ou sil savre impossible de trouver le nom de classe pour lobjet srialis. package java.io; public interface ObjectInput extends DataInput { public Object readObject() throws ClassNotFoundException, IOException; public int read() throws IOException; public int read(byte b[]) throws IOException; public int read(byte b[], int off, int len) throws IOException; public long skip(long n) throws IOException; public int available() throws IOException; public void close() throws IOException; }

Linarisation des objets (Serialization)Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

9/140Rvision : F-beta Date : 18/2/99

9Architecture de srialisationInterface SerializableLinterface Serializable sert identier les classes pouvant tre srialises : package java.io; public interface Serializable {}; Toute classe peut tre srialise dans la mesure o elle satisfait aux critres suivants :

La classe (ou une classe de la hirarchie de cette classe) doit implmenter java.io.Serializable. Parmi les classes standard non-susceptibles dtre linarises citons java.io.FileInputStream, java.io.FileOutputStream et java.lang.Threads. Les champs ne pas srialiser doivent tre reprs laide du mot cl transient. Si le mot cl transient nest pas affect ces champs, une tentative dappel de la mthode writeObject() gnrera une exception NotSerializableException.

Elments srialisablesTous les champs (donnes) dun objet Serializable sont crits dans le ot . Ils incluent les types de primitives, les tableaux et les rfrences dautres objets. A nouveau, seules les donnes (et le nom de classe) des objets rfrencs sont stockes. Les champs statiques ne sont pas srialiss. Il est noter que le mcanisme daccs aux champs (private, protected et public) na aucun effet sur le champ en cours de srialisation. .

Linarisation des objets (Serialization)Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

9/141Rvision : F-beta Date : 18/2/99

9Ecriture et lecture dun ot dobjetsEcritureSoit la classe : class Point implements java.io.Serializable { int x; int y; Point( int x, int y){ this.x = x; this.y = y; } }

Lcriture et la lecture dun objet dans un ot est un processus simple. Examinons le fragment de code suivant qui transmet une instance dun objet un chier :

Point myPoint = new Point(1,2); FileOutputStream fos = new FileOutputStream(myfile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(myPoint); oos.close();

Linarisation des objets (Serialization)Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

9/142Rvision : F-beta Date : 18/2/99

9Ecriture et lecture dun ot dobjetsLectureLa lecture de lobjet est aussi simple que lcriture, une exception prs la mthode readObject() retourne un rsultatde type Object, on doit donc transtyper (cast) le rsultat, avant que lexcution des mthodes sur cette classe soit possible : Point serialPoint; FileInputStream fis = new FileInputStream(myFile); ObjectInputStream ois = new ObjectInputStream(fis); serialPoint = (Point)ois.readObject();

Linarisation des objets (Serialization)Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

9/143Rvision : F-beta Date : 18/2/99

9Effets de la linarisationLorsquon linarise des objets avec des ObjectStreams on doit bien matriser les effets suivants :

Les instances rfrences par linstance en cours de linarisation sont leur tour linarises. Attention: les graphes de rfrences sont conservs (y compris sil y a des cycles!). haut proprio * gauche droite

haut transient proprio=X gauche droite

transfert Objet

bas1 proprio=X gauche * droite

bas2 proprio=X gauche * droite *

bas1 proprio * gauche * droite

bas2 proprio * gauche * droite *

Un mcanisme particulier (qui assure la proprit ci-dessus) fait que certaines mthodes ne sont appeles quune fois sur une instance donne. Pour que le Stream oublie les instances dej transfres utiliser la mthode reset(). La cration dun ObjectInputStream est un appel bloquant. On ne sortira de cet appel que lorsque le Stream aura reu un premier transfert qui lui permet de sassurer que le protocole avec lObjectOutputStream correspondant est correct. Lutilisation la plus simple du mcanisme de linariisation suppose que les JVM qui crivent et lisent les instances aient une connaissance a priori de la dnition des classes. Il peut se produire des cas o les versions de dnition de la classe ne sont pas tout fait les mmes entre les JVM : la spcication du langage Java (JLS) dnit prcisment les cas o ces versions sont considrs comme compatibles. Voir lutilitaire serialver pour connatre lidentiant de serialisation dune classe.

Linarisation des objets (Serialization)Intitul Cours: Programmation JAVA avance Copyright Sun Service Formation Rf. Sun : SL275

9/144Rvision : F-beta Date : 18/2/99

9Personnalisation de la linarisationpersonnalisation de la lecture/criture dobjetOn peut personnaliser la linarisation dune classe en dnissant deux mthodes prives writeObject and readObject. La mthode writeObject permet de contrler quelles informations sont sauvegardes. Typiquement on lutilise pour envoyer des informations complmentaires qui permettront de recons