cours de java - emmanuel.adam.free.fremmanuel.adam.free.fr/site/img/pdf/javautilesavancep.pdf ·...

85
Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 1 Cours de JAVA Quelques classes remarquables de JAVA Quelques classes remarquables de JAVA Emmanuel ADAM Institut des Sciences et Techniques de Valenciennes Université de Valenciennes et du Hainaut-Cambrésis source principale : « Thinking in Java (B. Eckel) »

Upload: doanhanh

Post on 12-Sep-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 1

Cours de JAVA

Quelques classes remarquables de JAVAQuelques classes remarquables de JAVA

Emmanuel ADAM

Institut des Sciences et Techniques de Valenciennes

Université de Valenciennes et du Hainaut-Cambrésis

source principale : « Thinking in Java (B. Eckel) »

Page 2: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 2

Quelques classes remarquables de JAVA

Page 3: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 3

La classe Object Il s’agit de la classe principale, elle contient les fonctions :

protected Object clone() qui crée et retourne une copie de l’objet boolean equals(Object obj) qui détermine si obj est égal à l’objet courant. protected void finalize() appelé par le ramasse miettes s’il n’y a plus de

référence à l’objet Class getClass() retourne la classe courante de l’objet int hashCode() retourne une clé pouvant être utilisée pour un tri void notify() réveille un processus en attente sur l’objet void notifyAll() réveille tous les processus en attente String toString() retourne une chaîne représentant l’objet void wait() met en pause le processus courant en attendant un réveil

Tous les objets Java héritent donc de ces méthodes

Page 4: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 4

La classe System Gestion du système :

static PrintStream err : sortie d'erreur standard static InputStream in : entrée standard static PrintStream out : sortie standard

static void arraycopy(...) : copie de tableaux

static long currentTimeMillis() : temps courant en millisecondes

static long nanoTime() : temps courant en nanoseconde

static void exit(int status) : sortie de programme static void gc() : lance le ramasse-miettes

static void load(String fichier) : charge le code en tant que librairie dynamique

Page 5: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 5

La classe System Gestion des propriétés du système :

static String getProperty(String key): retourne la valeur de la propriété spécifiée par la clé

static Properties getProperties(): retourne les propriétés du système

static String setProperty(String key, String value) : affecte une nouvelle valeur à une propriété

static void setProperties(Properties props) : affecte des propriétés

java.version : version de l'interpréteur Java. java.home : répertoire d'installation de Java. user.home : répertoire de l'utilisateur java.class.path : valeur du classpath file.separator, path.separator, line.separator...

Page 6: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 6

La classe String (1)

Les chaînes sont constantes, leurs valeurs ne peuvent être changées après leurs créations.

StringBuffer permet l’utilisation de chaînes "dynamiques".

Construction : String str = "abc"; est équivalent à char data[] = {'a', 'b', 'c'};String str = new String(data);

La classe String comporte des méthodes d’accès aux caractères, de comparaisons, de recherche, d’extraction, de copie, de conversion minuscules/majuscule, ...

Page 7: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 7

La classe String (2)

L’opérateur (+) est surchargé pour permettre la concaténation, et à la conversion implicite d’objets en chaîne.

Toute conversion se fait de manière automatique en faisant appel à la méthode toString() héritée de la classe Object. Il est donc possible de surcharger cette méthode dans les nouvelles classes créées.

Page 8: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 8

La classe String (3)

String permet de tronçonner une chaîne (abandon de StringTokenizer)

String ch = "une chaîne à tronçonner";String[]mots1 = ch.split(" ");String[]mots2 = ch.split("n");String[]mots3 = ch.split("n",3);

["une";"chaîne";"à";"tronçonner"]["u";"e chaî";"e à tro";"ço";"";"er"]["u";"e chaî";"e à tronçonner"]

Page 9: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 9

La classe StringBuffer A utiliser si besoin de chaînes dynamiques (modifications, concaténation, …)

int taille = 30000;long tpsDebut = System.currentTimeMillis();String ch = new String();for(int i=0; i<taille; i++) ch += i;System.out.println(ch);long tpsFin = System.currentTimeMillis();System.out.println("tps = "+ (tpsFin – tpsDebut));tpsDebut = System.currentTimeMillis();StringBuffer sb = new StringBuffer();String sep = ", ";for(int i=0; i<taille; i++)

sb.append(i).append(sep); System.out.println(sb);tpsFin = System.currentTimeMillis();System.out.println("tps = "+ (tpsFin – tpsDebut));

Le gain de temps pour la création de la chaîne représentant un tableau de 30000 entiers est ici de 7 sec environ !!!

par rapport au code précédent

(test sur java 1.6, Pentium M 1.6 MHz)

Page 10: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 10

Des classes très utiles (import java.util.*)

Interfaces : Collection, Comparator, Enumeration, EventListener, Iterator, List, ListIterator, Map, Map.Entry,Observer, Set, SortedMap, SortedSet

Classes : AbstractCollection, AbstractList, AbstractMap, AbstractSequentialList, AbstractSet, ArrayList, Arrays, BitSet, Calendar, Collections, Date, Dictionary, EventObject, GregorianCalendar, HashMap, HashSet, Hashtable, LinkedList, ListResourceBundle, Locale, Observable, Properties, PropertyPermission, PropertyResourceBundle, Random, ResourceBundle, SimpleTimeZone, Stack, StringTokenizer, TimeZone, TreeMap, TreeSet, Vector, WeakHashMap

Page 11: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 11

La classe Arrays

Cette classe contient des méthodes statiques pour la gestion de tableaux :

static int binarySearch(int []tab, int valeur)retourne l’index de la valeur, -1 si introuvable

static boolean equals (boolean []tab1, boolean []tab2)

static void fill (double []tab, double valeur)remplit le tableau avec la valeur

static void fill (char []tab, int debut, int fin, char valeur)

static void sort (long []tab)

static void sort (short [] tab, int debut, int fin)

s’appliquent à tous types de tableaux : d’entiers, de réels, d’objets (références seules prises en compte)

Page 12: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 12

La classe Arraysint []tab = new int[100];for(int i=0; i<tab.length; i++)

tab[i] = (int)(Math.random()*100);

long tpsDebut = System.currentTimeMillis();java.util.Arrays.sort(tab);long tpsFin = System.currentTimeMillis();

System.out.println("tri effectue en " + (tpsFin - tpsDebut) + " millisecondes");

56, 82, 84, 7, 87, 82, 23, 15, 37, 0, 32, 27, 11, 77, 59, 46, 95, 54, 63, 80, 72, 78, 43, 88, 97, 65, 91, 82, 20, 69, 18, 44, 67, 91, 81, 22, 11, 36, 86, 96, 5, 36, 90, 66, 71, 50, 6, 59, 6, 23, 46, 55, 41, 35, 69, 32, 50, 25, 64, 71, 82, 16, 13, 63, 56, 65, 88, 1, 60, 76, 18, 52, 28, 27, 3, 45, 37, 87, 0, 48, 31, 32,45, 25, 31, 59, 91, 28, 83, 78, 28, 4, 33, 40, 72, 54, 48, 45, 44, 22,

0, 0, 1, 3, 4, 5, 6, 6, 7, 11, 11, 13, 15, 16, 18, 18, 20, 22, 22, 23, 23, 25, 25, 27, 27, 28, 28, 28, 31, 31, 32, 32, 32, 33, 35, 36, 36, 37, 37, 40, 41, 43, 44, 44, 45, 45, 45, 46, 46, 48, 48, 50, 50, 52, 54, 54, 55, 56, 56, 59, 59, 59, 60, 63, 63, 64, 65, 65, 66, 67, 69, 69, 71, 71, 72, 72, 76, 77, 78, 78, 80, 81, 82, 82, 82, 82, 83, 84, 86, 87, 87, 88, 88, 90, 91, 91, 91, 95, 96, 97,

tri effectue en 0 millisecondes

1039728793720,1039728793720

Page 13: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 13

Autre fonctions sur les tableaux

static void arraycopy(Object tabSource, int debutSource, Object tabDest, int debutDest, int longeur)

est une méthode statique et native de la classe System à utiliser pour copier les tableaux.

int []tab2 = new int[100];

System.arraycopy(tab, 0, tab2, 0, 100);

Page 14: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 14

Vector

La classe Vector est la plus utilisée. Elle permet de stocker des objets dans un ensemble de longueur variable.

add (objet) permet d’ajouter un objet en queue, get(index) permet de récupérer l’objet positionné à l’index donné, find() permet de récupérer la position de l’objet, isEmpty() teste si le vecteur est vide, size() donne la taille du vecteur, toArray() retourne un tableau d’objets contenus dans le vecteur

La classe ArrayList est l’identique de la classe Vector, mais n’est pas synchronisée, elle est donc plus rapide et à utiliser de préférence

Page 15: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 15

Quelques classes de java.util

La classe Stack hérite directement de la classe Vector et ajoute entre autres les méthodes : push(objet) : ajoute un objet en tête ; pop() : retire le premier objet ; peek() : renvoie une référence au premier objet sans

le retirer ; empty() : teste si la pile est vide.

Une pile peut aussi contenir des objets de différents types.

Page 16: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 16

Quelques classes de java.util

La classe Hashtable peut être vue comme un dictionnaire composé de deux vecteurs : un vecteur pour la clé et un vecteur pour l’objet.

Une table de clés possède les méthodes : put(clé, objet) : get(clé) : containsKey(clé) : containsValue(objet) : isEmpty() : entre autres...

Page 17: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 17

Quelques classes de java.util

La classe Set définit un ensemble ne pouvant contenir qu’un exemplaire d’un objet.

Cette classe dispose, entre autres, des méthodes : add(objet) qui n’ajoute l’objet que s’il n’est pas déjà présent contains(objet) ; remove(objet) ; isEmpty().

Page 18: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 18

Quelques classes de java.util

L’interface Enumeration ne contient que deux méthodes : nextElement() : retourne l’objet (à caster) courant

et passe à l’élément suivant, hasMoreElements() : indique la présence d’au moins

un élément.

Page 19: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 19

Quelques classes de java.util

● L’interface Enumeration (suite)● utilisée surtout pour la lecture des éléments

d’un vecteur : for(Enumeration e=vecteur.elements();e.hasMoreElements();)

System.out.println((Personne)e.nextElement()) ;

(mais elle est plus longue que get(index))

int taille = vecteur.size();for(int i = 0; i<taille;i++)

System.out.println((Personne)vecteur.get(i)) ;

Remarque : elements() est la méthode qui retourne une énumération à partir du vecteur.

Page 20: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 20

Trier les éléments d’une ArrayList (1/3)

public static void sort (List list) de la classe Collections permet de trier une liste d’objets implémentant l’interface Comparable.

si la classe des objets à trier n’implémente pas l’interface Comparable, il faut alors fournir un Comparator.

Exemple de tri d’Integer dans une ArrayList : java.util.ArrayList al = new java.util.ArrayList();

for(int i=0; i<1000; i++)

al.add(new Integer((int)(Math.random()*1000)));

java.util.Collections.sort(al); // car une ArrayList implémente une List

Page 21: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 21

Trier les éléments d’une ArrayList (2/3)

/**Définition d’une classe implémentant l’interface Comparable */class Personne implements Comparable{ String nom; private int noSecu; Personne(){nom = ""; noSecu = 0;} Personne(String _nom, int _noSecu)

{nom = _nom; noSecu = _noSecu;} public String toString() { return nom+":"+noSecu; }

/**retourne –1 si objet < autre, 0 si objet == autre, 1 si objet > autre*/

public int compareTo(Object autre) { Personne p = (Personne)autre; return (nom.compareToIgnoreCase(p.nom)); }}

Page 22: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 22

Trier les éléments d’une ArrayList (3/3)

java.util.ArrayList al = new java.util.ArrayList();for(int i=0; i<10; i++)

al.add(new Personne("nom"+(int)(Math.random()*10), i));

String ch = "";for(int i=0; i<al.size(); i++) ch = ch + (Personne)al.get(i) + ", ";System.out.println(ch);

java.util.Collections.sort(al);

ch = "";for(int i=0; i<al.size(); i++) ch = ch + (Personne)al.get(i) + ", ";System.out.println(ch);

nom6:0, nom8:1, nom2:2, nom4:3, nom0:4, nom8:5, nom2:6, nom2:7, nom8:8, nom9:9,

nom0:4, nom2:2, nom2:6, nom2:7, nom4:3, nom6:0, nom8:1, nom8:5, nom8:8, nom9:9,

Page 23: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 23

Listes Génériques (depuis 1.5)

● Nécessité de préciser le type d'objets dans la collection ● But : Sécuriser le code

import java.util.ArrayList;ArrayList <Personne>liste = new ArrayList<Personne>();for(int i=0; i<10; i++)

liste.add(new Personne("nom"+i, i));String ch = "";for(Personne p : liste) ch = ch + p + ", ";

System.out.println(ch);

Page 24: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 24

Méthodes Génériques (depuis 1.5)

● Utilisation de caractères spéciaux (wilcard) remplaçant un type inconnu

● void listeObjet(ArrayList<?> liste){

for (Object o : liste) System.out.println(o);}

● void <T>tabVersliste(T[]tab, ArrayList<T> liste){

for (T obj : tab) liste.add(obj);}

Page 25: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 25

Méthodes Génériques (depuis 1.5)

● wilcard remplaçant une sorte d'objet● void listeObjet(ArrayList<? extends Animal> liste)

{for (Animal a : liste)

a.affiche();}

● <T, E extends T> E getObjet(ArrayList<T> liste)

Page 26: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 26

Classe Génériques (depuis 1.5)

Définition d'une classe utilisant des listes génériques :class MaClasseGen<P extends Personne,A extends Animal> {

ArrayList<A> listeA;ArrayList<P> listeP;

MaClasseGen(){listeP = new ArrayList<P>();listeA = new ArrayList<A>(); }

void add(P p) {listeP.add(p);}void add(A a) {listeA.add(a);}

}

Page 27: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 27

Classe Génériques (depuis 1.5)

Utilisation d'une classe utilisant des listes génériques :MaClasseGen<PersonneF, AnimalA> mcg

= new MaClasseGen<PersonneF, AnimalA>();mcg.add(new PersonneF("aa","a"));mcg.add(new AnimalA("aa"));mcg.add(new AnimalA("cc"));

Page 28: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 28

Gestion d’exceptions

Quelques classes remarquables de JAVAQuelques classes remarquables de JAVA

Emmanuel ADAMEmmanuel ADAM

Institut des Sciences et Techniques de ValenciennesInstitut des Sciences et Techniques de Valenciennes

Université de Valenciennes et du Hainaut-CambrésisUniversité de Valenciennes et du Hainaut-Cambrésis

source principale : « Thinking in Java (B. Eckel) »

Page 29: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 29

Les exceptions

La gestion des exceptions est très importante, voire primordiale, dans tous systèmes informatiques. Elle confère un aspect beaucoup plus professionnel aux applications.

Eviter les applications qui plantent sans information précise, ex :

Page 30: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 30

Les exceptions (2)

Les exceptions sont des instances des classes héritant des classes

java.lang.Error (pour des erreurs graves quasi impossibles à gérer : plus de mémoire, classe manquante, ...)

java.lang.Exception (pour des exceptions attendues sinon probables pouvant être gérée : débordement d’un tableau, erreur de calcul, ...).

Ces deux classes implémentent l’interface Throwable

Page 31: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 31

Les exceptions (3)

La classe Exception possède deux constructeurs Exception() et Exception (String msg) ).

Elle hérite de l’interface Throwable de : getMessage qui permet de récupérer le message de

l’exception s’il existe. toString, qui retourne la classe et le message sous forme

de chaîne. printStackTrace, qui fait appel à toString, mais qui en plus

indique l’endroit du programme où a été levée l’exception.

Page 32: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 32

Capture d’une exception

Pour récupérer, ou attraper, une exception : ….try

{…. //endroit où pourrait apparaître une exception }

catch (type_exception_1 e1) { …. // traitement de l’exception de type 1 }

catch (type_exception_2 e2) { …. // traitement de l’exception de type 2 }

finally { …. // dans tous les cas, passer par ici }

….

Page 33: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 33

Exemple (1)

int[] a = {1,2,3,4,5,6,7,8,9,10};int[] b = {10,9,8,7,6,5,0,3,2,1};int []c = new int[10];for(int i=0; i<=10; i++) {

try {c[i] = a[i] / b[i];

System.out.println("c["+i+"] = " + c[i]);}catch(Exception e) {

System.out.println("division par 0 ...");c[i] = 0;System.out.println("dans ce cas c["+i+"] = " + c[i]);

}}

Exception levée

Reprise du programme

Exception attrapée et gérée

Page 34: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 34

Des classes d’Exception

ClassNotFoundException, CloneNotSupportedException, IllegalAccessException, .InstantiationException, InterruptedException, NoSuchFieldException, NoSuchMethodException, RuntimeException, ArithmeticException, ArrayStoreException, ClassCastException, IllegalArgumentException, IllegalThreadStateException, NumberFormatException, IllegalMonitorStateException, IllegalStateException, IndexOutOfBoundsException, ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException, NegativeArraySizeException, NullPointerException, SecurityException, UnsupportedOperationException

Page 35: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 35

Exemple (2)

int[] a = {1,2,3,4,5,6,7,8,9,10};int[] b = {10,9,8,7,6,5,0,3,2,1};int []c = new int[10];for(int i=0; i<=10; i++) {

try {c[i] = a[i] / b[i];

System.out.println("c["+i+"] = " + c[i]);}catch(ArithmeticException e) {

System.out.println("division par 0 ...");c[i] = 0;System.out.println("dans ce cas c["+i+"] = " + c[i]);

}catch(Exception e) {

System.out.println("... erreur imprevue ...\n" + e);}

}

Exception levée

Autres erreurs

Erreur de calcul attrapée et gérée

Page 36: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 36

Propagation d’une exception

Si une exception n’est pas gérée dans une procédure, elle se propage hors de la procédure,

Il faut donc que cette procédure soit capable de propager l’exception (utilisation du mot clé throws),

Si à la fin du programme, une exception n ’a pas été attrapée, la pile des méthodes traversées par l'exception est affichée.

Page 37: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 37

Exemple (3)

public void diviser() throws Exception{ for(int i=0; i<=10; i++) { c[i] = a[i] / b[i]; System.out.println("c[" + i + "] = " + c[i]); } } void test() { try { diviser(); } catch(ArithmeticException e) { System.out.println("division par 0 ..."); } catch(Exception e) { System.out.println("... erreur imprevue ...\n" + e); } System.out.println("suite du prog"); }

Exception levée

Exception propagée

Exception attrapée et gérée

Page 38: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 38

Définir son exception

Il est possible de définir une exception en la faisant dériver de la classe Exception :

class MonExceptionDivision extends Exception{

public String toString(){

return "Problème de division";}

}Le mot clé throw permet de lancer son exception.

Page 39: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 39

Exemple (4)

public void diviser() throws Exception{ for(int i=0; i<=10; i++) { if (b[i] == 0) throw new MonExceptionDivision(); c[i] = a[i] / b[i]; System.out.println("c[" + i + "] = " + c[i]); } } void test() { try { diviser(); } catch(Exception e) { System.out.println("... erreur : " + e); } System.out.println("suite du prog"); }

Exception lancée

Exception propagée

Exception attrapée et gérée

Page 40: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 40

Les Entrées-Sortiesles package java.io.*/ java.nio.*

Emmanuel ADAMEmmanuel ADAM

Institut des Sciences et Techniques de ValenciennesInstitut des Sciences et Techniques de Valenciennes

Université de Valenciennes et du Hainaut-CambrésisUniversité de Valenciennes et du Hainaut-Cambrésis

source principale : « Thinking in Java (B. Eckel) »http://www.laltruiste.com/coursjava/sommaire.html api java

Page 41: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 41

La classe Java.lang.System

Utilisation des classes et interfaces du package java.io

Il existe trois flux (flots) : System.in : flux d’entrée standard, System.out : flux de sortie standard, System.err : flux de sortie pour message d’erreur.

Les entrées sorties peuvent générer une exception de type IOException à gérer

Page 42: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 42

Exemple de flux d’entrée standard

import java.io.*;class Lire {

public static void main(String[] argv){

int b, nb = 0;try{

while((b = System.in.read()) != 13) // 13 = code retour chariot{

nb++;System.out.println(b); // affiche les codes ascii des caractères

}}catch(IOException e) { System.out.println(e); }

}}

Lecture d’un caractère au clavier

Page 43: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 43

Gestion de fichiers

La classe File permet d’accéder aux caractéristiques des fichiers et répertoires.

Trois constructeurs : File(File dir, String name) ; File(String path, String name); File(String path).

Les différentes méthodes sont : canRead() ; canWrite() ; delete() ; equals(Object

obj) ; exists() ; getAbsolutePath() ; getCanonicalPath() ; getName() ; getParent() ; getPath() ; hashCode() ; isAbsolute() ; isDirectory() ; isFile() ; lastModified() ; length() ; list(FilenameFilter filter) ; list() ; mkdir() ; mkdirs() ; renameTo(File dest) ; toString().

Page 44: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 44

Exemple d’utilisation de ‘File’

import java.io.*;

public class ChercheFichier { public static void main(String args[]) {

String nomFichier = "ChercheFichier.java" ; File f = new File(nomFichier); if (f.exists()) { String nomRep = f.getAbsolutePath(); // retourne le répertoire et le fichier nomRep = nomRep.substring(0, nomRep.lastIndexOf("\\")); System.out.println( nomFichier + " est dans le repertoire " + nomRep); System.out.println(" droits en lecture, ecriture : " + f.canRead() + "," +

f.canWrite() ); } }}

Page 45: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 45

Flux d’entrées

InputStream dont dérivent les classes ByteArrayInputStream, FileInputStream, FilterInputStream, ObjectInputStream, PipedInputStream, SequenceInputStream et StringBufferInputStream

Reader (orientée caractères) dont dérivent les classes BufferedReader, LineNumberReader, CharArrayReader, FilterReader, PushbackReader, InputStreamReader, FileReader, PipedReader, StringReader

Page 46: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 46

Flux de sorties

OutputStream dont dérivent les classes

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, PipedOutputStream

Writer (orientée caractères) dont dérivent les classes

BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

Page 47: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 47

Ecriture directe dans un fichier ‘FileOutputStream’

Exemple d’écriture dans un fichier :

public static void main(String args[]){ File f = new File("C:\\donnees", "data.txt"); try {

FileOutputStream fos = new FileOutputStream(f);String s = new String (" Coucou ");int longueur = s.length();byte[] buffer = s.getBytes();for(int i = 0; i < longueur; i++) fos.write(buffer[i]);fos.close();

} catch (Exception e) {}} Ecriture d’un tableau de bytes

Transformation d’une chaîne en tableau de bytes

Page 48: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 48

Lecture directe d’un fichier : ‘FileInputStream’

public static void main(String args[]) { File fichier = new File("C:\\donnees", "data.txt"); if (fichier.exists()) { String chaine = ""; FileInputStream fis = null; byte[] b = new byte[1024]; try { fis = new FileInputStream(fichier);} catch (FileNotFoundException fnfe) {System.out.println(fnfe);} try { int i =fis.read(b); } catch (IOException ioe) {System.out.println(ioe);}

System.out.println(new String(b)); try { fis.close(); } catch (IOException ioclose) {System.out.println(ioclose);} } }

Lecture d’un tableau de bytes

Transformation en chaîne

Page 49: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 49

Ecriture filtrée dans un fichier ‘DataOutputStream’

Ecriture de données typées, (chaînes de caractères à éviter depuis jdk1.1)

public static void main(String args[]){ File fichier = new File("data.bin"); try {

FileOutputStream fos = new FileOutputStream(fichier);DataOutputStream dos = new DataOutputStream(fos);dos.writeBoolean(true); dos.writeInt(17); dos.writeDouble(17.89); dos.writeBoolean(false); dos.writeInt(16); dos.writeDouble(16.84); dos.close();fos.close();

}catch (Exception e) {}

}

Page 50: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 50

Lecture filtrée d’un fichier ‘DataInputStream’

Lecture de données typées, (sauf des chaînes de caractères depuis java 1.1)

…File fichier = new File("data.bin");if(fichier.exists()) {

try { FileInputStream fis = new FileInputStream(fichier); DataInputStream dis = new DataInputStream(fis); System.out.println(dis.readBoolean() + "," + dis.readInt() + "," + dis.readDouble()); System.out.println(dis.readBoolean() + "," + dis.readInt() + "," + dis.readDouble()); dis.close(); fis.close(); }

catch (Exception e) {}}…

Page 51: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 51

Lecture en séquence de fichiers ‘SequenceInputStream’

SequenceInputStream(Enumeration e) : permet de lire les InputStream de l’énumération en séquence

SequenceInputStream(InputStream s1, InputStream s2) : permet de lire deux InputStream en séquence

public static void main(String args[]) { File fichier1 = new File("data1.txt"); File fichier2 = new File("data2.txt"); if(fichier1.exists() && fichier2.exists()) { try {

FileInputStream fis1 = new FileInputStream(fichier1);FileInputStream fis2 = new FileInputStream(fichier2);

SequenceInputStream sis = new SequenceInputStream(fis1, fis2); String chaine = ""; int caractere = 0; while ((caractere = sis.read()) !=-1) chaine += (char)caractere; System.out.println(chaine);

sis.close(); fis1.close(); fis2.close(); } catch (Exception e) {} }

Affiche le contenu des deux fichiers à l’écran

Page 52: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 52

Flots de caractères

Notion de flot de caractères (characters Streams) : On ne travaille plus uniquement sur des bytes,

mais sur des caractères Apparition de 2 classes : Writer et Reader

FileReader <-> FileInputStream FileWriter <-> FileOutputStream

Echange facile de données avec accents (unicode)

Page 53: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 53

Entrée de flots de caractères

Flot de caractères Description

Reader Classe Abstraite pour flot d’entrée (InputStream)

BufferedReader Bufférise les entrées ligne par ligne

LineNumberReader Garde trace du nb de lignes lues

CharArrayReader Lit un tableau de caractères

InputStreamReader Transforme un flot de byte et car. Unicode

FileReader Transforme des bytes lus depuis un fichier en car.

FilterReader Classe abstraite pour filtrer les caractères d’entrées

PipedReader Lecture depuis PipeWriter

StringReader Lit depuis une chaîne de caractères

Page 54: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 54

Sortie de flots de caractères

Flot de caractères Description

Writer Classe Abstraite pour flot de sortie (OutputStream)

BufferedWriter Bufférise les sorties ligne par ligne

CharArrayWriter Ecrit un tableau de caractères

InputStreamWriter Transforme un flot de car. Unicode en flot de bytes

FileWriter Transforme un fichier de car. en flot de bytes

PrintWriter Ecrit des valeurs et des objs dans un Writer

PipedWriter Ecrit dans un PipeWriter

StringWriter Ecrit dans une chaîne de caractères

Page 55: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 55

Exemple (FileWriter)

public static void main(String args[]){

File f = new File("C:\\Progjava\\fichier", "Essai.txt");try{

FileWriter fw = new FileWriter(f);PrintWriter pw = new PrintWriter(fw);// ou PrintWriter pw = new PrintWriter(new FileWriter(f));pw.println("coucou");pw.close(); fw.close();

}catch (Exception e) {}

}

Page 56: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 56

Exemple (FileReader)

public static void main(String args[]){

String chaine = "";File f = new File("C:\\Progjava\\fichier", "Essai.txt");try{

FileReader fr = new FileReader(f);BufferedReader br = new BufferedReader(fr);

// ou BufferedReader br = new BufferedReader(new FileReader(f));chaine = br.readLine(); // retourne null si fin de fichierbr.close(); fr.close();

}catch (Exception e) {} System.out.println(chaine);

}

Page 57: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 57

Exemple (Saisie clavier)

public static void main(String args[]){

String chaine = "";try{

InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(isr);chaine = br.readLine();br.close(); isr.close();

}catch (Exception e) {}System.out.println(chaine);

}

Page 58: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 58

Accès en lecture/écriture

RandomAccessFile(String name, String mode) : ouvre le fichier selon le mode donné : r lecture seule; rw lecture/écriture;

public static void main(String args[]) { File fichier = new File("ChercheFichier.java"); if(fichier.exists()) { try { RandomAccessFile raf = new RandomAccessFile(fichier, "rw"); long longueur = raf.length(); raf.seek(longueur); raf.writeBytes("// fin du fichier\n"); raf.close(); } catch (Exception e) {} } }

Ajout d’une chaîne (en fin de fichier ici)

Se déplacer dans le fichier

Page 59: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 59

La sérialisation

Signifie persistance,

Pour éviter la perte des données à la fin de l’exécution

Si un objet contient un autre objet, ce dernier est aussi sérialisé, et on obtient un arbre de sérialisation

Page 60: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 60

Sérialisation (2)

Les objets transients (transitoires,éphémères)

Ce sont des objets qui ne peuvent pas être sérialisés (processus, flux de données)

Si ils sont définis en tant qu’attributs dans un objet sérialisé, il faut indiquer qu’ils sont transitoires

idem si on ne veut pas que certains attributs d’un objet soient sérialisés

Page 61: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 61

Syntaxe pour la sérialisation

La classe doit implémenter l’interface serializable(pas de méthode à implémenter)

Exemple :import java.io.*;

class MaClasse implements Serializable {

public transient Thread mathread;private String nom;private int total;...

Page 62: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 62

Sauvegarde d’un objet

public static void main(String args[]){

Personne p1 = new Personne("p1", 25);Personne p2 = new Personne("p2", 50);File f = new File("C:\\Progjava\\fichier", "Essai.obj");try{

FileOutputStream fos = new FileOutputStream(f);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(p1);oos.writeObject(p2);oos.close(); fos.close();

}catch (Exception e) {}

}

Page 63: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 63

Lecture d’un objet persistant

public static void main(String args[]){

File f = new File("C:\\Progjava\\fichier", "Essai.obj");try{

FileInputStream fis = new FileInputStream(f);ObjectInputStream ois = new ObjectInputStream(fis);Personne p1 = (Personne) ois.readObject();Personne p2 = (Personne) ois.readObject();ois.close(); fis.close();

}catch (Exception e) {}

}

Page 64: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 64

Les canauxles package java.nio.channels.*

Les canaux peuvent être bidirectionnel ; apporte la sécurité par la notion de verrou ;gestion de flux en mémoire

La classe Channels permet la conversion des flux d'entrée/sortie en canaux de lecture/écriture,

des canaux de lecture/écriture en flux d'entrée/sortie,

Les canaux FileChannel sont spécialisés dans la gestion des fichiers : Lecture, écriture, positionnement, troncature et blocage

par verrou

Page 65: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 65

Les canauxles package java.nio.channels.*

Un objet Pipe est constitué d'un canal en lecture et d'un canal en écriture, utilisables

Les canaux ServerSocketChannel et SocketChannel définissent les canaux par sockets (serveur et client)

Récupération d'un canal à partir d'un flux par getChannel()FileInputStream fis =

new FileInputStream(new File("chemin"));

FileChannel fc = fis.getChannel();

Page 66: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 66

Les canauxles package java.nio.channels.*

Ouverture d'un canal à sa création (isOpen()) en lecture, écriture, lecture.écriture

Plusieurs méthodes de lectures/écriturespar les interfaces ReadableByteChannel et WritableByteChannel

Possibilité de : fermer un canal

lecture/écriture à une position donnée,

forçage de l'écriture sur le support physique,

protection par verrou d'une zone du canal

Page 67: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 67

Les tamponsles package java.nio.*

Utilisation de tampon ByteBuffer , IntBuffer, ...pour des données binaires

Tampon = séquence finie, linéaire, de primitives

Principales propriétés = capacité, limite, position, marque

Capacité = nb d'éléments, fixe

Limite = index du premier élément non modifiable/lisible

Position = index du prochain élément modifiable/lisible

Marque = index de retour

Page 68: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 68

Les tamponsles package java.nio.*

clear() : limite <-- 0 et position <-- 0

flip() : limite <-- position puis position <-- 0

rewind() : position <-- 0

reset() : position <-- marque

Page 69: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 69

Copie de fichier par canauxles package java.nio.*

void copieFichier(File ficSource, File ficDestination, boolean rapide){ try {

FileInputStream fisSource = new FileInputStream(ficSource);FileOutputStream fosDestination = new FileOutputStream(ficDestination);

FileChannel canalSource = fisSource.getChannel(); FileChannel canalDestination = fosDestination.getChannel(); ByteBuffer tampon = null; if(rapide) tampon = ByteBuffer.allocateDirect(1024);

else tampon = ByteBuffer.allocate(1024); int nb_octets = 0; while ((nb_octets = canalSource.read(tampon)) > -1) { tampon.flip(); canalDestination.write(tampon); tampon.clear(); } } catch(IOException e) { e.printStackTrace(); } }

Page 70: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 70

Les tamponsles package java.nio.*

Tampon peut être direct, alors :

la JVM tente d'utiliser des opérations natives sur le buffer

Évite de copier en dur à chaque opération

Coût allocation élevé

à réserver pour large tampon utilisé sur une longue durée

Page 71: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 71

Les tamponsles package java.nio.*

Transfert du fichier en mémoire : MappedByteBuffer

File fichier = new File("c:\\source.txt");RandomAccessFile raf= new RandomAccessFile(fichier, "rw");FileChannel canal= raf.getChannel();MappedByteBuffer tampon= canal.map(FileChannel.MapMode.READ_WRITE, 0, fc.size());

Impossibilité pour un processus d'accéder à un fichier mappé => penser à clore le canal

load() charge le tampon en mémoire

isLoad() vérifie son chargement

force() provoque l'écriture sur le fichier réel

Page 72: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 72

Vérouillage de canauxles package java.nio.*

Possibilité de mise en place d'un verrouillage d'une partie ou de la totalité d'un fichier. (classe FileLock)

Objectif : coordonner l'accès à un fichier

Un verrou peut être : Exclusif : seul le code le posant peut agir sur le canal

Partagé : aucun autre code ne peut poser de verrous exclusifs

boolean acces_partage = false;FileLock verrou = canal.lock(debut, taille, acces_partage);//ouFileLock verrou = canal.lock();

Page 73: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 73

Vérouillage de canauxles package java.nio.*

Un verrou sur un canal bloque un autre programme appelant

=> demande d'obtention du verrou : FileLock monVerrou = canal.tryLock();

Possibilité de verrou sur une partie

Libération d'un verrou : verrou.release();

Page 74: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 74

Canaux de socketles package java.nio.*

Deux classes : ServerSocketChannel et SocketChannel

Un ServerSocketChannel attend des connections et crée des SocketChannel.

Un socketchannel est associé à une socket getChannel()

Un socketchannel peut être bloquant ou non. ConfigureBlocking(true) ; isBlocking().

Page 75: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 75

Canaux de socketles package java.nio.*

ServerSocketChannel Créé par ServerSocketChannel.open()

Lié à un ServerSocket récupérable par socket()

Relier le socket serveur à un port : bind(new InetSocketAddress(noPort))

Le ServerSocketChannel est alors lié à ce port

Peut accepter plusieurs connections

Page 76: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 76

Canaux de socketles package java.nio.*

SocketChannel Créé par SocketChannel.open()

Connection au serveur par connect(SocketAddress a)

non bloquant, connect() accepté de suitebloquant, la connection tourne en fond

Vérification de la demande de connection : isConnectionPending()

Vérification du résultat de la connection : isConnected()

Demande la fin de la connection : finishConnect()

Page 77: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 77

Encodage/décodageles package java.nio.charset.*

Le décodage : processus de transformation d'un bloc d'octets (bytes) en une chaine de caractères, selon un jeu de caractères (charset).

L'encodage : processus de tranformation d'une séquence de caractères en un bloc de données selon un jeu de caractères.

Liste de jeux de caractères disponibles (ISO-8859-1, UTF-8, ...): Charset.availableCharsets()

Récupérer un CharSet : Charset.forName("ISO-8859-1");

Page 78: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 78

Encodage/décodageles package java.nio.charset.*

Obtenir un décodeur et encodeur d'un CharSet : CharsetDecoder decodeur = leCharSet.newDecoder();CharsetEncoder encodeur = leCharSet.newEncoder();

Un décodeur décode un tampon d'octets en un tampon de caractèresByteBuffer tampon = ByteBuffer.allocate(1024);...CharBuffer cb = decoder.decode(tampon);

Un encodeur encode un tampon de caractères, ou une chaîne, d'octets en un tampon d'octetsString chaine = "Une chaîne de caractères...";CharBuffer cb = CharBuffer.wrap(chaine);ByteBuffer bb1 = encoder.encode(cb);ByteBuffer bb2 = encoder.encode("Une chaîne");

Page 79: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 79

Encodage/décodageles package java.nio.charset.*

Gestion des erreurs (encodage et décodage) : D'entrée : onMalformedInput De caractère : onUnmappableCharacter

Possibilité de :

Ignorer l'erreur (IGNORE) Remplacer l'entrée par une valeur de remplacement (REPLACE) Reporter (REPORT)l'erreur par la levée d'exception ou par un objet

CoderResult

ByteBuffer bb = leCharSet.newDecoder().onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE).decode(bb);

Page 80: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 80

Encodage/décodageles package java.nio.charset.*

Récupérer les erreurs : CodingErrorAction actionEntreeIncorrecte =

leCharSet.malformedInputAction();CodingErrorAction actionCaractereInconnu =

leCharSet.unmappableCharacterAction();

Par la déclaration d'un CoderResult :

Supposons un mauvais décodage :

CharBuffer sortie = decodeur.decode(entree);déclenche une exception

CoderResult erreur = decodeur.decode(entree, sortie, false);Retourne l'objet erreurisError(), isMalformed(), isOverflow(), isUnderflow(), isUnmappable()

Page 81: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 81

Sélecteur de canauxles package java.nio.*

Selector : utilisés pour des opérations d'entrée/sortie asynchrones,applications client/serveur.

multiplexeur d'objets SelectableChannel.

SelectionKey est un jeton de SelectableChannel auprès de Selector

Création d'un sélecteur : Selector monSelecteur = Selector.open();

Page 82: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 82

Sélecteur de canauxles package java.nio.*

Client A

Serveur

Client C

Client B

SELECTEUR

SocketChannel

SocketChannel

SocketChannelclés

Page 83: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 83

Sélecteur de canauxles package java.nio.*

Le socket Serveur peut activer un sélecteur en cas : De connection d'un client (OP_ACCEPT) De connection (OP_CONNECT),de lecture (OP_READ), d'écriture

(OP_WRITE)

Enregistrement auprès d'un socket serveur par le sélecteur : ServerSocketChannel serveur = ServerSocketChannel.open();...SelectionKey cle = serveur.register(monSelecteur, SelectionKey.OP_ACCEPT);

Le sélecteur enregistre les canaux provoquant l'opération associéeint nbCles = monSelecteur.select();

Page 84: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 84

Sélecteur de canauxles package java.nio.*

Récupération d'une clé : Set lesCles = selecteur.selectedKeys();

... Iterator it = lesCles.iterator(); while(it.hasNext()){ SelectionKey uneCle = (SelectionKey)it.next(); //... }

Récupérer un événement associé à une clé : uneCle.isAcceptable, isConnectable(), isReadable() et isWritable().

Lancer l'événement : SocketChannel canal = canal.accept().

Page 85: Cours de JAVA - emmanuel.adam.free.fremmanuel.adam.free.fr/site/IMG/pdf/JavaUtilesAvanceP.pdf · Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 85

Sélecteur de canauxles package java.nio.*

Redéfinir l'option du canal dans le sélecteur (pour lire les données): SelectionKey cleserveur =

canal.register(selecteur, SelectionKey.OP_READ);

La connexion est établie, les sockets (client et serveur) peuvent communiquer entre eux.

Le canal référencé en lecture est sélectionné par le sélecteur.

Pour désinscrire un canal et le supprimer du sélecteur : canal.keyFor(selecteur).cancel();canal.close();