230 likes | 318 Views
J201 (JOC). Java Avancé. Le typesafe enums. Créer une énumération : enum HorizontalAlign{ LEFT, RIGHT, CENTER }; Accéder : HorizontalAlign.LEFT; HorizontalAlign.RIGHT; HorizontalAlign.CENTER;. Les Collections.
E N D
J201 (JOC) Java Avancé ~ Brigitte Groléas ~
Le typesafe enums • Créer une énumération : enum HorizontalAlign{ LEFT, RIGHT, CENTER }; • Accéder : HorizontalAlign.LEFT;HorizontalAlign.RIGHT;HorizontalAlign.CENTER; ~ Brigitte Groléas ~
Les Collections • Pour chaque type de structure de données (liste, ensemble, association) il existe une interface et plusieurs implémentations • Set : élément unique • List : liste, avec doublons • Map : suite de couples clé-valeur List list = new ArrayList(); Set set = new HashSet(); Map map = new TreeMap(); ~ Brigitte Groléas ~
Les implémentations de List • Vector (vieux, déconseillé par sun): doublons possibles, accès indexé, synchronisée (adaptée au multithread) lourd. Bien pour ajout ou suppression en fin de tableau ainsi que pour la recherche à un indice particulier (la représentation en mémoire est un tableau) • ArrayList : tableau, doublons possibles, accès indexé (non synchronosée) plus legere que vector (non adaptée au multi thread). Bien pour ajout ou suppression en fin de tableau ainsi que pour la recherche à un indice particulier (la représentation en mémoire est un tableau) Pour synchroniser une ArrayList : List synchronizedList = Collections.synchronizedCollections(new ArrayList());" • LinkedList : liste chainée, doublons possibles, accès indexé, bien pour ajouter ou supprimer n’importe où dans la liste ~ Brigitte Groléas ~
Les tables d'association java.util.Map : interface qui abstrait la notion de table d'association • HashMap : table gérée par Hcode (+ courante) • HashSet : pas de doublon java.util.SortedMap : interface idem Map mais ordonné induit un accès plus rapide. • TreeMap : arbre balancé • TreeSet : pas de doublon ~ Brigitte Groléas ~
Les Itérateurs List v = new ArrayList(); Individu i = new Individu(); v.add( i); Iterator it = v.iterator(); while( it.hasNext()) { Individu j = (Individu)it.next(); j.affiche(); } ~ Brigitte Groléas ~
Générique List<Individu> v =new ArrayList<Individu> (); Individu i = new Individu(); v.add( i); Iterator <Individu> it = v.iterator(); while( it.hasNext()) { Individu j = it.next(); j.affiche(); } ~ Brigitte Groléas ~
La documentation générer la documentation : javadoc Syntaxe : javadoc fichier.java <RC> Génère fichier.html, qui contient l ’index des classes, attributs et méthodes. ~ Brigitte Groléas ~
Mise en place de documentation public class Perso{ void f1(){ … } void f2(){ … } /** * Par les soirs bleus d'été, * j'irai par les sentiers ... * @version 1.1.1b 15/03/98 * @param qtte : un <i>chiffre</i> parmi d'autre * @see #f1() * @see #f2() * @return un chiffre */ public int compte( int qte ){ // ... return 5; } } • on obtient les fichiers : • AllNames.html • Packages.html • tree.html ~ Brigitte Groléas ~
La documentation de Sun ~ Brigitte Groléas ~
Saisie au clavier Gestion de l'exception Fin de ligne String lireligne() throws java.io.IOException { StringBuffer tab = new StringBuffer( 20 ); char c; while( ( c = (char)System.in.read() ) != '\r' ) tab.append( c ); return tab.toString(); } Saisie d'un caractère au clavier Transformation du StringBuffer en String ~ Brigitte Groléas ~
Les classes imbriquées • Une classe à l'intérieur d'une autre classe. • La classe imbriqué peut accéder aux données privées de la classe supérieure public class AA { private long var; public static class BB { public int i; ... } ... } Acces depuis l'extérieure par package.AA.BB une classe imbriquée static se comporte exactement comme une classe normale, sauf pour la visibilité des variables ~ Brigitte Groléas ~
Classe interne • Classe imbriquée non static • inner classe • Associée à une instance particulière • Ne peut pas exister sans l'intentiation de la classe externe • Les variables de la classe externe sont accessibles à la classe interne ~ Brigitte Groléas ~
Nombre variable d’arguments (varargs) • public int totalise(int ... valeurs) { • int total = 0; • for (int val : valeurs) { • total += val; • } • return total; • } Appel : totalise(1,2,3)); totalise(2,5,6,8,10)); int[] données = {1,2,3,4}; totalise(données)); ~ Brigitte Groléas ~
Les fichiers • 4 classes "mères", abstraites, pour traiter les flots de données héritant directement d'Object : • pour traiter de flots d'octets • la classe InputStream • la classe OutputStream • pour traiter de flots de caractères • la classe Reader • la classe Writer ~ Brigitte Groléas ~
La classe FileReader permet de lire des caractères dans un fichier. • La classe FileWriter permet d'écrire des caractères dans un fichier. ~ Brigitte Groléas ~
La sérialisation • Compresse les informations de l’objet pour qu’il soit ‘transportable’ • Les données dans le fichier ne peuvent pas être lues comme du texte par une autre application • L’objet, lorsqu’il est lu, est décompressé, et retrouve son existence dans un tas (ie une vm) • permet d'échanger des données entre applications distribuées, • permet la persistance des objets : un objet est persistant si sa durée de vie est supérieure au programme qui l'a créé. Une des façons d'obtenir de le persistance est la sérialisation dans des fichiers. ~ Brigitte Groléas ~
Serialisable = transformable en une suite d'octets • ObjectInputSteam en lecture, instancié à partir d'un InputStream, sa méthode readObject() peut lever une exception ClassNotFoundException. • readObject() renvoie un Object donc il faut faire un cast pour récupérer le bon type • ObjectOutputSteam en écriture, instancié à partir d'un OutputStream sa méthode writeObject() ~ Brigitte Groléas ~
Lire et écrire un texte dans le fichier FileWriter fw= new FileWriter( "c:/titio.txt",true); fw.write( "velo\n"); fw.close(); FileReader fr = new FileReader( "c:/titio.txt"); BufferedReader br = new BufferedReader(fr); // pour ligne ligne à ligne String s = br.readLine() ; fr.close(); FileReader reader = new FileReader("c:/titio.txt"); do { lu = reader.read(); if (lu != -1) { c = (char) lu; System.out.print( c); } } while (lu != -1); // tant que l'on est pas à la fin du fichier reader.close(); ~ Brigitte Groléas ~
La classe File • Tester l'existence d'un fichier File f = new File("c:/titio.txt"); if (f.exists()) System.out.println("existe"); else System.out.println("existe pas"); • Récuperer le nom sans le chemin File file = new File("c:/titio.txt"); System.out.println(file.getName());//affiche titio.txt • Renommer un fichier File nouveauNom=new File("c:/suiv.txt"); file.renameTo(nouveauNom); • Lister les fichiers d'un répertoire File repertoire = new File("c:/"); String[] listeFichiers = repertoire.list(); for (int i=0;i < listeFichiers.length;i++) System.out.println(listeFichiers[i]); ~ Brigitte Groléas ~
Fenêtre de choix class EssaiChoixFichier { public static void main(String[] argv) throws IOException { JFileChooser dialogue = new JFileChooser(); PrintWriter ecrivain; File fichier; if (dialogue.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { fichier = dialogue.getSelectedFile(); ecrivain = new PrintWriter(new FileWriter(fichier.getPath(), true)); ecrivain.println(argv[0]); ecrivain.close(); } System.exit(0); } } Fait apparaître la fenêtre modale de dialogue permettant de sélectionner un fichier. ~ Brigitte Groléas ~
Lire les 20 premiers octets du fichier titi et les afficher à l’écran InputStream fluxFichier = new FileInputStream ("c:/titi.txt"); byte contenuFichier [ ] = new byte [20]; fluxFichier.read (contenuFichier); System.out.println (new String (contenuFichier)); fluxFichier.close (); ~ Brigitte Groléas ~
Lire et écrire un objet dans le fichier • FileOutputStream fichier = new FileOutputStream("c:/essai"); ObjectOutputStream flotEcriture = new ObjectOutputStream(fichier); for (int i=0; i<5; ++i) flotEcriture.writeObject(tab[i]); flotEcriture.close(); • FileInputStream fichier2 = new FileInputStream("c:/essai"); ObjectInputStream flotLecture = new ObjectInputStream(fichier2); Object lu; for (int i=0; i<5; ++i) { lu = flotLecture.readObject(); if (lu instanceof Date) tab2[i]=(Date)lu; else System.out.println("eee"); flotLecture.close(); ~ Brigitte Groléas ~