cours de java - emmanuel.adam.free.fremmanuel.adam.free.fr/site/img/pdf/javautilesavancep.pdf ·...
TRANSCRIPT
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) »
Emmanuel ADAM – Université de Valenciennes et du Hainaut Cambrésis –– Cours JAVA n°2 – p: 2
Quelques classes remarquables de JAVA
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
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
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...
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, ...
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.
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"]
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)
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
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)
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
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);
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
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.
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...
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().
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.
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.
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
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)); }}
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,
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);
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);}
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)
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);}
}
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"));
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) »
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 :
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
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.
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 }
….
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
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
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
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.
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
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.
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
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
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
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
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().
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() ); } }}
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
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
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
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
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) {}
}
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) {}}…
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
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)
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
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
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) {}
}
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);
}
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);
}
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
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
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
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;...
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) {}
}
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) {}
}
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
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();
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
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
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
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(); } }
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
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
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();
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();
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().
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
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()
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");
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");
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);
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()
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();
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
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();
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().
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();