Java - notions de bases pour développeur

1,969 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,969
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
146
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Java - notions de bases pour développeur

  1. 1. Java La syntaxe Les aspects techniques jd@olek.fr - Version du 22/10/13 mercredi 23 octobre 13
  2. 2. Rapide historique • 1995 : sortie de la première version • Rachat de Sun par Oracle en 2009 • Langage issu des concepts objets • Plus mature que C++, Smalltalk... • Portable sur plateformes hétérogènes • Principe de virtualisation de l’exécution mercredi 23 octobre 13
  3. 3. Différentes versions • • • 1996 : JDK 1.0 (211 classes) 1997 : JDK 1.1 (477 classes) 1998 : Java 2 (1 524 classes) • • • • • • • • mercredi 23 octobre 13 J2ME : Mobile Edition J2SE : Reprise du Java “standard” J2EE : Enterprise Edition (serveur) 2000 : J2SE 1.3 (1 840 classes) 2002 : J2SE 1.4 (2 723 classes) 2004 : J2SE 5.0 (3 270 classes) 2006 : Java SE 6 (3 777 classes) 2011 : Java SE 7 (8 000 classes)
  4. 4. Cycle de compilation d’un langage ‘classique’ Compilateur Code source toto.c Editeur de liens Code objet toto.o •Fichier texte •Fichier binaire •Compatibilité si langage •Compatibilité CPU normé Code exécutable toto.exe •Fichier binaire •Compatibilité OS Liaison avec des bibliothèques faisant la liaison avec le système mercredi 23 octobre 13
  5. 5. Compilation/exécution en Java Compilateur Code source Toto.java •Fichier texte •Compatibilité totale (norme gérée par Sun) Exécution par la JVM Bytecode Toto.class •Fichier binaire •Compatibilité JVM Code interprété ou émulé •Exécution directe en mémoire •Compatibilité OS Liaison avec des bibliothèques elles aussi en bytecode mercredi 23 octobre 13
  6. 6. Caractéristiques du langage (1) • Hétérogène • Peut s’exécuter dans des environnements très divers • Pas de problème de compatibilité • Même au niveau des types • Même au niveau de l’interface graphique mercredi 23 octobre 13
  7. 7. Caractéristiques du langage (2) • Objet • Bénéficie des retours d’expériences d’avant 95 • Ce n’est pas une adaptation d’un langage existant • Tout est encapsulé dans des classes • Simple • La syntaxe est simplifiée et abordable mercredi 23 octobre 13
  8. 8. Caractéristiques du langage (3) • Robuste • La JVM détecte les erreurs et gère les éventuelles fuites mémoire • Orienté réseau • Gestion native des threads • Protocoles réseaux inclus en standard • Informatique distribuée mercredi 23 octobre 13
  9. 9. Caractéristiques du langage (4) • (relativement) ouvert sur l’extérieur • Les interfaces JNI permettent de faire passerelle avec les parties “natives” du système (matériel, réseau, OS...) • Très typé Web • J2EE fournit un serveur d’application complet pour le Web • Tous les standards sont là : XML, Ajax... mercredi 23 octobre 13
  10. 10. Points faibles • L’étape d’interprétation de la JVM entraine bien sûr une plus grande lenteur et lourdeur • La syntaxe est simplifiée par rapport à d’autres langages (C++...) • En revanche, certaines subtilités “techniques” ne sont pas possibles mercredi 23 octobre 13
  11. 11. Environnements de développement • L’ex Leader : Borland JBuilder • Aujourd’hui : Eclipse / IBM Rational App Dev • Base OpenSource donnée par IBM • Extensions par Plugins • Plugins OpenSource ou IBM • Chez Sun : NetBeans mercredi 23 octobre 13
  12. 12. Les commandes de base • java : appel à la JVM • javac : compilateur, produit des .class • javap : désassembleur • javadoc : génère la documentation • jar : gestion des Java ARchives mercredi 23 octobre 13
  13. 13. Compilation manuelle • Vérifier la présence des variables d’environnement : • JAVA_HOME : pointe sur le JDK • PATH : doit intégrer $JAVA_HOME/bin • CLASSPATH : doit intégrer $JAVA_HOME/lib ainsi que vos propres librairies (répertoires et .jar) mercredi 23 octobre 13
  14. 14. My first class • Et c’est parti ! Dans un fichier texte Essai.java, on tape : public class Essai { public static void main(String args[]) { System.out.println(“Goodbye cruel world !”); } } http://fr.wikipedia.org/wiki/Hello_world mercredi 23 octobre 13
  15. 15. Utilisation de base des commandes • javac Essai.java • Compile notre fichier Essai.java • On obtient un fichier Essai.class • java Essai • Lance la classe contenue dans Essai.class mercredi 23 octobre 13
  16. 16. Notion de packages • Les classes sont organisées en packages, afin de les organiser • Les packages sont des répertoires • On prend souvent le nom de domaine de la société pour garantir un nom unique • Dans le code, un package est représenté sous la forme : package fr.olek.cours.debutant; mercredi 23 octobre 13
  17. 17. Déclaration d’une classe dans un package package fr.olek.cours.repondeur; public class Repondeur { ... } Le fichier se trouve dans : /fr/ecoms/cours/repondeur/ mercredi 23 octobre 13
  18. 18. Appel d’une classe dans un package • La syntaxe est plutôt lourde : public class Essai { public static void main(String args[]) { fr.olek.cours.repondeur.Repondeur r= new fr.olek.cours.repondeur.Repondeur(); } } mercredi 23 octobre 13
  19. 19. Utilisation de la clause import • Il vaut mieux l’importer : import fr.olek.cours.repondeur.Repondeur; public class Essai { public static void main(String args[]) { Repondeur r=new Repondeur(); } } mercredi 23 octobre 13
  20. 20. Divers usages d’import • import n’importe pas “physiquement” les packages mentionnés • Simple indication à la JVM pour savoir où trouver les classes utilisées • Il est possible d’importer toutes les classes d’un package d’un coup : import fr.olek.cours.repondeur.*; • Attention, ça n’inclue pas les sous-packages ! import fr.olek.*; // ne va pas importer “Repondeur” mercredi 23 octobre 13
  21. 21. Régler les ambiguités • Dans certains cas, des classes portent le même nom, dans des packages différents import java.awt.*; // contient une classe “Point” import fr.olek.geometrie.Point; ... Point p=new Point(); // on utilise le nôtre mercredi 23 octobre 13
  22. 22. Imports statiques • Nouveauté de Java 5.0 • Permet d’éviter la syntaxe classe.méthode ou classe.attribut • Exemple : import static java.lang.Math; ... aire=rayon*java.lang.Math.PI; aire=rayon*Math.PI; aire=rayon*PI; mercredi 23 octobre 13
  23. 23. Les commentaires • Pour commenter une seule ligne : // Ligne de commentaire • Bloc de commentaire : /* Début de bloc .... Blabliblu */ • Bloc de commentaire de documentation /** Début de bloc .... Blabliblu */ mercredi 23 octobre 13
  24. 24. Les types de données • On les appelle “types scalaires” • 3 grands types : • Numériques • Entiers • Réels • Booléens • Caractères mercredi 23 octobre 13
  25. 25. Les types numériques • Ils sont tous complètement normalisés ! • Quelque soit la plateforme, un même type aura toujours la même représentation • Les entiers sont par défaut signés • long et short sont des types à part entière mercredi 23 octobre 13
  26. 26. Les différents types numériques disponibles Type Taille mémoire byte 1 octet short 2 octets int 4 octets long 8 octets • Par défaut, les nombres sont de type int • Les suffixes permettent de forcer un type : 1234L mercredi 23 octobre 13
  27. 27. Types réels Type Taille mémoire float 4 octets double 8 octets • Contrairement à C/C++, il existe une vraie arithmétique en float • Par défaut, un nombre à virgule est un double • Suffixe pour un float : 12.24F mercredi 23 octobre 13
  28. 28. Type booléen • Fini les réprésentations via des entiers 0 et 1 (ou 0 et -1, ou 1 et 2...) • Java propose un type boolean à part entière • 2 constantes particulières • true • false • boolean est le seul type utilisé pour les tests • Toute expression de test est donc booléenne mercredi 23 octobre 13
  29. 29. Exemple de test booléen Expression booléenne if(a==b) .... • Pour tester un booléen : boolean flag=false; ... if(flag==true) if(flag) mercredi 23 octobre 13 Expression redondante if(flag==false) if(!flag)
  30. 30. Conditions if(expression) instruction1; else instruction2; instruction3; mercredi 23 octobre 13 •Chaque expression est booléenne •Chaque instruction peut être remplacée par un bloc : { if(expression1) instruction1; else if(expression2) } instruction2; else if(expression3) instruction3; else instruction4; instruction 1; ... instruction n;
  31. 31. Choix multiples int choix; switch(choix) { case 1: Exécuté si choix=1 i=3; break; Ordre de débranchement case 2: case 3: i=4; break; Exécuté si choix=2 ou 3 default: i=3; Choix par défaut } mercredi 23 octobre 13 switch/case ne marche qu’avec des types scalaires ! (=>pas de String)
  32. 32. Boucles • La boucle type en Java est while : while(condition) { instruction1; } Exécuté au moins une fois mercredi 23 octobre 13 do { instruction1; } while(condition)
  33. 33. Boucle for • Héritée du langage C • En fait, un condensé d’une boucle while avec incrémentation for(exp_init; exp_test; exp_maj) { instruction1; } exp_init; while(exp_test) { instruction1; exp_maj; } Exemple : for(int i=0;i<10;i++) ... mercredi 23 octobre 13
  34. 34. Caractères • • • • mercredi 23 octobre 13 Particularité de Java : tout caractère est au format UNICODE sur 16 bits Saisie d’une constante caractère : char char char char c1=’A’; c2=’t’; c3=’060’; c4=’u0030’; // // // // // Caractère en dur Séquence d’échappement classique du C Exactement 3 chiffres en octal Exactement 4 chiffres en hexadécimal pour une constante UNICODE Attention aux caractères Français accentués Unicode conseillé... • char eacute=’u00E9’; // le caractère « é » char est de toute manière peu utilisé On préférera utiliser la classe String •
  35. 35. Chaîne de caractères • Fini les bidouilles de tableau de caractères • On utilise une classe à part entière String s=new String(“bonjour les amis”); • ou plutôt : String s=”bonjour les amis”; mercredi 23 octobre 13
  36. 36. Concaténation String nom=”Paul”; String phrase=”Bonjour,”+nom+”, comment va ?”; • On peut également concaténer des éléments autres que “String” • Ils seront automatiquement convertis int age=10; String phrase=”Tu as “+age+” ans”; mercredi 23 octobre 13
  37. 37. Concaténation par buffer • La concaténation classique de String implique une reconstruction systématique String s=”Bonjour”; s=s+” les amis”; // s est une nouvelle instance • La classe StringBuffer résoud ce problème d’efficacité StringBuffer sb=new StringBuffer(); sb.append(“Bonjour”); sb.append(“ les amis”); String s=sb.toString(); mercredi 23 octobre 13
  38. 38. Comparaison de chaînes de caractères • La comparaison directe va comparer les pointeurs, pas le contenu : if(s1==s2) ... • La comparaison de contenu nécessite l’utilisation de la méthode equals() : if(s1.equals(s2)) ... mercredi 23 octobre 13
  39. 39. Intérêt d’une classe • Rappel : une classe = • des informations (attributs) • des actions pour manipuler ces informations (méthodes) • Ici, chaque instance de String rassemble : • La chaîne de caractères • De quoi retravailler cette chaîne mercredi 23 octobre 13
  40. 40. Encapsulation dans une chaîne de caractères Avant : La chaîne : char[50] Les outils : (répartis dans diverses librairies) strcmp strstr strpos ... mercredi 23 octobre 13 Après : String chaine substr(int,int) size() equals(String) ...
  41. 41. Méthode vs Fonction • Taille d’une chaîne en PHP via la fonction strlen : $taille=strlen($chaine); • Equivalent en Java : Un outil auquel on fournit la donnée int taille=chaine.length(); Une donnée encapsulant ses outils mercredi 23 octobre 13
  42. 42. Méthodes utiles de String trim() Supprime les espaces toLowerCase() Force en minuscules toUpperCase() Force en majuscule subString(int,int) Retourne une sous-chaîne indexOf(String) Retourne la position d’une sous chaine charAt(int) Renvoie le caractère à la position donnée length() Renvoie la longueur de chaîne ... ... mercredi 23 octobre 13
  43. 43. Utilisation de la Javadoc mercredi 23 octobre 13
  44. 44. Utilisation de la Javadoc 临河而羡鱼,不如归家织网 mercredi 23 octobre 13
  45. 45. Utilisation de la Javadoc 临河而羡鱼,不如归家织网 Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprend à pêcher, il mangera toujours.  mercredi 23 octobre 13
  46. 46. Liste des packages Index des méthodes Package Héritage Liste des classes mercredi 23 octobre 13
  47. 47. Clic pour voir le détail Regarder le type de sortie pour choisir une bonne méthode Méthode statique mercredi 23 octobre 13
  48. 48. Transtypage / Casting • Le transtypage permet de gérer les conversions d’un type à un autre • Différents cas se présentent : • D’un type scalaire à un autre • D’une classe à une autre • Entre classes et types scalaires mercredi 23 octobre 13
  49. 49. Casting entre types scalaires • Tout est possible, mais attention aux pertes de précision int i=10; double d=10.1; d=i; // interdit d=(double)i; // autorisé i=(int)d; // autorisé, mais perte de précision mercredi 23 octobre 13
  50. 50. Perte de précisions dans les calculs • Exemple : int i=4; int j=3; double result=i/j; i/j est une expression donnant un entier • Pour limiter la perte, il faut : double result=i/(double)j; ou double result=(double)i/j; mercredi 23 octobre 13 int / double est un double
  51. 51. Cast entre classes : downcasting Livre livre=new Livre(...); Produit prod; prod=(Produit) livre; // autorisé prod=livre; // autorisé, car un livre EST un produit mercredi 23 octobre 13
  52. 52. Cast entre classes : upcasting Produit prod=new Livre(...); // autorisé (downcast) Livre livre; livre=prod; // interdit livre=(Livre)prod; // autorisé, mais risqué mercredi 23 octobre 13
  53. 53. Cast entre classes et types scalaires • Ex : passer un String en int, ou inversement • Ce n’est pas possible directement • Deux notions totalement différentes • On passe par un intermédiaire • Les class wrappers (enrobeurs) mercredi 23 octobre 13
  54. 54. Les class Wrappers • Ce sont des classes encapsulant des types scalaires • Ex : Integer iWrap=new Integer(12); • Permet de faire bénéficier ses types scalaires des atouts d’une classe : • Fournir la donnée avec ses outils mercredi 23 octobre 13
  55. 55. Class Wrappers disponibles Type primitif boolean byte double short int long float char mercredi 23 octobre 13 Wrapper Boolean Byte Double Short Integer Long Float Character
  56. 56. Conversion d’un String en int Javadoc du class Wrap Integer : String s=”12”; Integer iWrap=new Integer(s); int val=iWrap.intValue(); mercredi 23 octobre 13
  57. 57. Conversion String/int avec une méthode statique Javadoc du class Wrap Integer : String s=”12”; int val=Integer.parseInt(s); Syntaxe classe.méthode() mercredi 23 octobre 13
  58. 58. Conversion int en String • On utilise encore le classwrap Integer : int val=12; Integer iWrap=new Integer(val); String s=iWrap.toString(); • Il existe aussi une méthode statique dans String : String s=String.valueOf(val); • Autre méthode, plus “douteuse” : String s=””+val; mercredi 23 octobre 13
  59. 59. Autoboxing de Java5 • Dans certains cas, l’encapsulation de types dans des classwrap est automatique en Java>5 • Exemple : Avant : List l=new ArrayList(); int val=100; l.add(new Integer(val)); Après : List l=new ArrayList<Integer>(); int val=100; l.add(val); Conversion implicite mercredi 23 octobre 13
  60. 60. Listes dynamiques • Classes héritant de la structure List : • ArrayList : redimensionnement auto d’un tableau • LinkedList : véritable liste chaînée • Chaque classe a ses atouts en termes d’efficacité • Mais l’utilisation est la même mercredi 23 octobre 13
  61. 61. Exploitation d’une liste • Création : ArrayList liste=new ArrayList(); • Remplissage : liste.add(element); • Récupération d’un élément : Voiture v=(Voiture)liste.get(i); mercredi 23 octobre 13
  62. 62. Typage de listes en Java >5 • Avant : upcasting risqué Voiture v=(Voiture)liste.get(i); • Après : listes typées et typage implicite ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... Voiture v=liste.get(i); mercredi 23 octobre 13
  63. 63. Parcours de liste par boucle for ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... for(int i=0;i<liste.size();i++) { size() détermine Voiture v=liste.get(i); le nb d’éléments ... } mercredi 23 octobre 13
  64. 64. Parcours de liste par itérateur ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... Iterator<Voiture> it=liste.iterator(); while(it.hasNext()) { Voiture v=it.next(); ... } mercredi 23 octobre 13
  65. 65. Parcours de liste par itérateur implicite (Java5) ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... for(Voiture v: liste) { v.accelere(); Il s’agit en fait d’un «foreach» ... } mercredi 23 octobre 13
  66. 66. Expression d’une instance en String • Par défaut, Java ne sait pas comment “afficher” une instance Voiture v=new Voiture(); System.out.println(v); ➡Voiture@2a18bdf • Cet affichage est en fait effectué par une méthode toString() de la classe Object • Rappel : toutes les classes héritent d’Object mercredi 23 octobre 13
  67. 67. Surcharge de toString() • Surcharger cette méthode permet de personnaliser l’affichage de l’instance public class Voiture { ... public String toString() { return “Je suis la voiture “ +this.nom; Voiture v=new Voiture(); } System.out.println(v); } Je suis la voiture XXX ➡ mercredi 23 octobre 13
  68. 68. Intérêts de la méthode toString() • Le concept d’instance “autodescriptive” est très intéressant pour le debug • Il est possible d’utiliser des appels à toString() en cascade : • Ex : ArrayList possède une méthode toString() qui va appeler le toString() de chacun de ses éléments mercredi 23 octobre 13
  69. 69. Exceptions • Une exception représente soit : • Une erreur (système) • Une erreur (de votre application) • Un cas alternatif mercredi 23 octobre 13
  70. 70. Section de code critique • Le code potentiellement source d’erreur sera encadré par un bloc try : try { FileReader f=new FileReader(“unfic.txt”); } mercredi 23 octobre 13
  71. 71. Capture des erreurs • Chaque bloc try est suivi d’un ou plusieurs blocs catch • Si une erreur apparaît, l’exécution de try est stoppée, et le bloc catch apparaît à la place mercredi 23 octobre 13
  72. 72. Enchaînement try/catch try { ... } catch(IOException ioe) { .... gestion de l’erreur de type IO } catch(Exception e) { ... gestion des autres erreurs } mercredi 23 octobre 13
  73. 73. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  74. 74. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  75. 75. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  76. 76. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  77. 77. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  78. 78. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  79. 79. Que faire en cas d’erreur ? • L’erreur peut se réparer localement ? • On fait un try/catch • L’erreur est grave, il faut sortir de la méthode • On relance l’exception via un throws mercredi 23 octobre 13
  80. 80. Avant la remontée d’erreur void uneMethode() { .... instructionAProbleme ... } { .... inst.uneMethode(); ... } mercredi 23 octobre 13
  81. 81. Remontée d’erreur void uneMethode() throws IOException { .... instructionAProbleme ... } { .... Cet appel est devenu section try de code critique { inst.uneMethode(); } catch(IOException ioe) { ... } ... } mercredi 23 octobre 13
  82. 82. Différentes exceptions • Celles héritant de Exception • “checked exceptions”, les plus connues • Celles héritant de Error • Erreurs système graves • Celles héritant de RuntimeException • “unchecked exceptions”, n’obligeant pas un try/catch pour les gérer mercredi 23 octobre 13
  83. 83. Le bloc finally • Est exécuté qu’il y aie une erreur ou non • Finalement presque identique au bloc de données après le catch • Mais est exécuté même en cas de sortie anticipée de la fonction mercredi 23 octobre 13 try { ..... } catch(Exception e) { .... ; return; } finally { .. // est exécuté avant le return }
  84. 84. Générer ses propres exceptions 1) Définir l’exception • Il s’agit d’une classe héritant de Exception public class QINegatifException extends Exception { public QINegatifException(String nom) { super(“Attention, “+nom+” a un QI d’huitre !”); } Appel constructeur classe } mère mercredi 23 octobre 13
  85. 85. Générer ses propres exceptions 2) Lancer l’exception • Lorsque celà vous parait utile, vous lancez l’exception { ... if(qi<0) throw new QINegatifException(“bob”); ... } mercredi 23 octobre 13
  86. 86. Générer ses propres exceptions 3) Définir le code critique • La méthode où vous avez lancé l’exception devient section de code critique void ajoutLofteur(Lofteur l) throws QINegatifException { Ne pas confondre ... avec throw (sans S) if(l.getQi()<0) throw new QINegatifException(l.getNom()); ... } mercredi 23 octobre 13
  87. 87. Générer ses propres exceptions 4) Lever l’exception • On gère l’appel au code critique comme à l’accoutumée try L’utilisateur de la { classe est obligé par le compilateur de gérer l’exception ... ‘proprement’ loft.ajoutLofteur(l); ... } catch(QINegatifException qie) { ... } mercredi 23 octobre 13
  88. 88. Comment gérer l’erreur ? • Le plus souvent, on se contente d’afficher l’erreur • System.err.println(e.getMessage()); • e.printStackTrace(); • Autant que possible, effectuer un traitement adéquat • Le plus souvent, tout ce joue dans ce qu’on va mettre dans le try / en dehors du try mercredi 23 octobre 13
  89. 89. Lire un fichier de propriétés • La plupart des applis Java stockent leurs paramètres dans un fichier texte de type : machin.properties • Il existe une petite classe permettant de faciliter l’accès à ces propriétés mercredi 23 octobre 13
  90. 90. Utilisation de la classe Properties Fichier monappli.properties import java.util.Properties; monappli.url=http://www.olek.fr monappli.chemin=/usr/local/appli Properties prop = new Properties(); // Lecture du fichier contenant les données de configuration FileInputStream in = new FileInputStream("monappli.properties"); prop.load(in); in.close(); // Extraction des propriétés String url = prop.getProperty("monappli.url"); String user = prop.getProperty("monappli.chemin"); mercredi 23 octobre 13
  91. 91. Marshalling XML • Objectif : sauvegarder une trace de ses données sous forme d’un fichier XML • Exemple : fichier de configuration • On peut utiliser : • Des outils complets de marshalling (CastorXML, par ex) • Les classes standards de Java • XStream (http://xstream.codehaus.org) mercredi 23 octobre 13
  92. 92. Avec Java standard • Depuis la v1.4, on dispose de classes XMLEncoder et XMLDecoder • Usage : XMLEncoder e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream("Test.xml"))); e.writeObject(instanceASerialiser); e.close(); mercredi 23 octobre 13
  93. 93. Limitation de ces classes • Utilisation impérative de beans (constructeur sans paramètre et get/set systématiques) • Code XML généré lourd • On voit les objets ArrayList, etc... • A réserver à l’archivage de petites classes isolées • Par ex, classe de configuration mercredi 23 octobre 13
  94. 94. Avec XStream XStream xstream = new XStream(new DomDriver()); // écriture du XML à partir d’une instance de classe xstream.toXML(inst, new BufferedOutputStream( new FileOutputStream("Test.xml"))); // lecture du XML et récupération de l’instance MaClasse inst=(MaClasse) xstream.fromXML(new BufferedInputStream( new FileInputStream("Test.xml"))); • On peut également gérer des “mappings” permettant de préciser les noms utilisés au final dans le XML mercredi 23 octobre 13
  95. 95. Sérialisation • Va prendre une “image “ d’une instance telle qu’elle est présente en mémoire • Et la transforme en suite d’octets que l’on peut manipuler directement • Pour transfert via le réseau • Pour stockage dans un fichier ou une base (dans un blob) mercredi 23 octobre 13
  96. 96. Mise en place • Les classes à stocker doivent implémenter l’interface Serializable • Cette interface est vide, aucune méthode à implémenter • Elle joue simplement le rôle de marqueur • On utilise ensuite les outils ObjectOutputStream et ObjectInputStream mercredi 23 octobre 13
  97. 97. ObjectOutputStream • Exemple de stockage dans un fichier : ! FileOutputStream fos = new FileOutputStream("t.tmp"); ! ObjectOutputStream oos = new ObjectOutputStream(fos); ! oos.writeObject(moninstance); ! oos.close(); fos.close(); mercredi 23 octobre 13
  98. 98. ObjectInputStream • Relecture de l’objet à partir du fichier ! FileInputStream fis = new FileInputStream("t.tmp"); ! ObjectInputStream ois = new ObjectInputStream(fis); ! MaClasse instanceRecup=(MaClasse)ois.readObject(); ! oos.close(); fos.close(); mercredi 23 octobre 13
  99. 99. Qu’est ce qui est sérialisé ? • Données ET méthodes • Vraie encapsulation • Sérialisation en cascade • Si des attributs pointent vers d’autres objets, ils sont sérialisés (même les listes) • Pour ignorer un attribut : transient mercredi 23 octobre 13
  100. 100. Gestion des logs • Objectif : remplacer les bêtes “println” qui parsement nos programmes • Pourquoi ? • Pouvoir les rediriger où l’on veut (fichier...) • Gérer différents niveaux d’affichage • Debug, erreurs... mercredi 23 octobre 13
  101. 101. L’outil Log4J d’Apache • Autre possibilité : java.util.logging • Permet la gestion de différents niveaux d’erreur • DEBUG >WARN>INFO>ERROR • Ainsi que le reroutage sur divers périphériques • CONSOLE, LOGFILE... • Possibilité de gérer des roulements de fichiers mercredi 23 octobre 13
  102. 102. Utilisation de Log4J mercredi 23 octobre 13 // récup du fichier de configuration PropertyConfigurator.configure("log4j.properties"); //initialisation du Logger Logger log=Logger.getLogger(Essai.class); // émission de messages log.debug("debug!!"); log.warn("warn !"); log.fatal("fatal !"); log.info("info !");
  103. 103. Fichier de configuration # Set root category priority to INFO and its only appender to CONSOLE. log4j.rootCategory=INFO, CONSOLE #log4j.rootCategory=INFO, CONSOLE, LOGFILE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=INFO log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[%t] %-5p %c - %m%n mercredi 23 octobre 13

×