12 LES FICHIERS 1-169169 JAVA Christine BONNET
LES FLOTS Package java.io La gestion des E/S s'effectue à l'aide des flots. Un stream (flot) représente un canal de communication ( écran, fichier, pipe, ). Un flot peut être représenté comme un buffer et des mécanismes associés pour réaliser l'e/s. Lecture ou écriture d'octets ou de caractères (Unicode : caractères à deux octets). 1-170170 JAVA Christine BONNET
LES CLASSES DE BASE DU PACKAGE java.io Flux orientés octets (ex. fichiers binaires) InputStream : lecture OutputStream : écriture Flux orientés caractères (ex. fichiers texte) Reader Writer Ces classes abstraites ne sont pas utilisées directement mais par de biais de classes dérivées. Autres classes de base File : nommage d'un fichier, informations RandomAccessFile : accès aléatoires sur un fichier. 1-171171 JAVA Christine BONNET
La classe File import java.io.file; class FileExample { public static void main(string args[]) { File file1 = new File("file.txt"); // déclaration d'un fichier System.out.println("Le fichier : " + file1.getname() + (file1.isfile()? " est un fichier" : " est un canal nomme ou un repertoire")); System.out.println("Taille : " + file1.length()); System.out.println("Chemin : " + file1.getpath()); System.out.println("Chemin absolu : " + file1.getabsolutepath()); System.out.println("Date de derniere modification : " + file1.lastmodified()); System.out.println(file1.exists()? "Le fichier existe " : "Le fichier n'existe pas "); System.out.println(file1.canRead()? "Le fichier peut etre lu" : "Le fichier ne peut pas être lu"); System.out.println(file1.canWrite()? "L'ecriture est autorisee" : "L'ecriture n'est pas autorisee"); System.out.println(file1.isDirectory()? "Le fichier est un repertoire " : "Le fichier n'est pas un repertoire"); 1-172172 JAVA Christine BONNET
Le fichier : file.txt est un fichier Taille : 24 Chemin : file.txt Chemin absolu : C:\JAVA\file.txt Date de derniere modification : 1069843750000 Le fichier existe Le fichier peut etre lu L'ecriture n'est pas autorisee Le fichier n'est pas un repertoire Appuyez sur une touche pour continuer... 1-173173 JAVA Christine BONNET
SÉRIALISATION DÉ-SÉRIALISATION Processus permettant : de sauvegarder des objets (dans un fichier) ou de restaurer des objets (à partir d'un fichier) Les objets sérialisés doivent implémenter l'interface Serializable (cette interface ne possède ni attributs, ni constructeurs, ni méthodes, elle indique simplement qu'un objet est sérialisable) Utilisation des classes ObjectOutputStream (sérialisation) et ObjectInputStream (dé-sérialisation) (classes dérivées de OutputStream et InputStream) 1-174174 JAVA Christine BONNET
LA SÉRIALISATION Le stockage permanent des objets peut être accompli en utilisant un fichier comme OutputStream La classe java.io.fileoutputstream permet de définir un flux en sortie pour écrire des données dans un fichier. (FileOutputStream dérive de la classe OutputStream) String nomfic = "FCOMPTE"; // nom du fichier File f1 = new File(nomFic); // déclaration d'un fichier // définition d'un flot de sortie FileOutputStream fo = new FileOutputStream(f1); La classe java.io.objectoutputstream permet d'écrire des données de type primitif (boolean, byte, char, int, etc.) et des objets dans un OutputStream. ObjectOutputStream foobj = new ObjectOutputStream(fo); 1-175175 JAVA Christine BONNET
LA SÉRIALISATION Écriture d'un objet donné sur le flux ObjectOutputStream Méthode void writeobject(object obj) foobj.writeobject(tabcompte) ; // écriture d'un tableau d'objets Fermeture du flux la classe de l'objet doit être public la classe de l'objet doit implémenter l'interface Serializable cette méthode appelle la méthode writeobject de chaque objet composite - si leur classe implémente l'interface Serializable - et jusqu'à ce que tout ce qui compose l'objet soit écrit. Méthode void close() foobj.close(); 1-176176 JAVA Christine BONNET
LA DÉ-SÉRIALISATION La classe java.io.fileinputstream permet de définir un flux en entrée pour lire des données à partir d'un fichier. (FileInputStream dérive de la classe InputStream) // définition d'un flot en lecture FileInputStream fi = new FileInputStream(f1); La classe java.io.objectinputstream permet de lire des données de type primitif (boolean, byte, char, int, etc.) et des objets à partir d'un InputStream. ObjectInputStream fiobj = new ObjectInputStream(fi); 1-177177 JAVA Christine BONNET
LA DÉ-SÉRIALISATION Lecture d'un objet dans un flux ObjectInputStream Méthode Object readobject() Cette méthode renvoie une référence sur Object transtypage obligatoire Compte table[] = (Compte []) fiobj.readobject(); Si la classe d'appartenance de l'objet est inconnue utilisation des méthodes de la classe Class : getname() et getclass() monobjet.getclass().getname() 1-178178 JAVA Christine BONNET
COMPLÉMENTS Lorsqu'un attribut d'une classe ne doit pas être sérialisé, le déclarer transient. Un attribut static n'est pas sérialisé. Les sous-classes d'une classe Serializable le sont. Pour qu'une classe effectue un traitement durant la sérialisation/dé-sérialisation elle doit implémenter les méthodes : private Object readobject(objectinputstream stream) throws IOException, ClassNotFoundException; private void writeobject(objectoutputstream stream) throws IOException; 1-179179 JAVA Christine BONNET
EXEMPLE import java.io.*; public class TestSerialisation { public static void main(string args[]) { Compte[] tabcompte = new Compte[3]; tabcompte[0] = new Compte("Bern", 3500); tabcompte[1] = new Compte("Ardisson", 1000); tabcompte[2] = new Compte("Gerra", 7500); try { // Sérialisation // Ouverture d'un fichier String nomfic = "FCOMPTE"; // nom du fichier File f1 = new File(nomFic); // déclaration du fichier // Définition d'un flux de sortie FileOutputStream fo = new FileOutputStream(f1); ObjectOutputStream foobj = new ObjectOutputStream(fo); // Ecriture du tableau dans le fichier foobj.writeobject(tabcompte); // Fermeture du flux foobj.close(); 1-180180 JAVA Christine BONNET
System.out.println("\n Lecture du fichier\n"); // Définition d'un flux d'entrée FileInputStream fi = new FileInputStream(f1); ObjectInputStream fiobj = new ObjectInputStream(fi); // Lecture et récupération dans un tableau Compte table[] = (Compte[])fiObj.readObject(); // Affichage des résultats for (int i = 0; i < table.length; i++) System.out.println(table[i]); // Fermeture du flux fiobj.close(); // fin du try catch (Exception e) { e.printstacktrace(); System.out.println("\n"+ e.getmessage()+"\n"); // fin main // fin de TestSerialisation 1-181181 JAVA Christine BONNET
// Extrait de la classe Compte import java.io.*; public class Compte implements Serializable { // variable de classe private static int derniernum = 0; // attributs de la classe private int numcompte; private String nompers; private float soldecompte; // Constructeur Compte(String nom, float solde) { numcompte = ++derniernum; nompers = new String(nom); soldecompte = solde; // Méthodes public String tostring() { return "\n Compte numero : " + numcompte+" \n Client : " +nompers + "\n Solde : " +soldecompte +"\n"; // // fin de la classe Compte 1-182182 JAVA Christine BONNET
13 LES CLASSES UTILITAIRES 1-183183 JAVA Christine BONNET
Package java.util Le package java.util contient des interfaces et des classes, spécialisées dans la gestion des structures de données et utilitaires. Interfaces : Collection, List, Set, SortedSet Iterator (parcours d'une collection), Comparable (comparaison d'objets) Classes : Vector, Stack, Array Random, Date 1-184184 JAVA Christine BONNET
COMPLÉMENTS SUR LA CLASSE VECTOR Conteneur d'objets de type tableau (collection d'objets de type quelconque) Permet d'implémenter un tableau dynamique Chaque vecteur possède une capacité (taille maximale). Si cette taille est dépassée, la capacité est augmentée automatiquement. Les objets stockés peuvent provenir de classes différentes. Accès aux éléments du vecteur : par un index ou un itérateur. La classe Vector implémente l'interface List il est possible de l'utiliser comme une liste. 1-185185 JAVA Christine BONNET
Vector() //crée un vecteur vide Vector(int capacitéinitiale) // // crée un vecteur vide de capacité initialcapacité Vector(int capacitéinitiale, int incrémentecap ) Constructeurs de la classe Vector // // crée un vecteur vide de facteur d'accroissement spécifié Quelques méthodes de la classe Vector Insertion d'un élément boolean add(object o) // // ajoute l'élément à la fin du vecteur void add(int Index, Object element) // // insère l'élément donné en position donnée 1-186186 JAVA Christine BONNET
Quelques méthodes de la classe Vector (suite) Recherche - information Object get(int index) // // renvoie l'élément situé à la position indiquée int indexof(object element) // // recherche la première occurrence d'un élément- surcharge // // nécessaire de la méthode equals / critère de recherche int size() // // renvoie le nombre de composants du vecteur Suppression - Modification Object remove(int index) // // supprime l'élément situé à la position indiquée boolean remove(object o) // // supprime la première occurrence de l'élément donné void clear() // // supprime tous les éléments du vecteur 1-187187 JAVA Christine BONNET
Quelques méthodes de la classe Vector (suite) Conversion d'un vecteur en un tableau Object[] toarray() Object[] toarray(object[]tab) Tri du conteneur 1. Spécifier que la classe des objets du conteneur implémente l'interface Comparable 2. Implémenter la méthode compareto dans cette classe 3. Invoquer la méthode sort de la classe Collections Vector conteneur = new Vector(20,5);. Collections.sort(conteneur); 1-188188 JAVA Christine BONNET
// Extrait de la classe Personnel //import java.util.*; public class Personnel implements Comparable { // variable de classe private static int derniernum = 0; // attributs de la classe private int numpers; private String nompers; private String numtel; // Constructeur Personnel(String nom, String nutel) { numpers = ++derniernum; nompers = new String(nom); numtel = new String(nuTel); 1-189189 JAVA Christine BONNET
// Méthodes // Implémentation de compareto de l'interface Compare // pour pouvoir trier public int compareto(object p) { return numtel.compareto(((personnel)p).numtel); public void affiche() { System.out.println(" Numero de Personne : "+numpers); System.out.println(" Nom : "+nompers); System.out.println(" Numero de telephone : "+numtel+"\n"); // pour l'utilisation de indexof public boolean equals(personnel p) { return numpers==p.numpers; // // fin de la classe Personnel 1-190190 JAVA Christine BONNET
import java.util.*; public class TestVecteur { public static void main(string args[]) { // Définition d'un objet de la classe Vector de 20 éléments // dont la capacité augmente de 5 en cas de débordement Vector conteneur = new Vector(20,5); // Ajout d'objets de la classe Personnel conteneur.add(new Personnel("Garou","0144436578")); conteneur.add(new Personnel("Mc Solaar","0123143676")); conteneur.add(new Personnel("Baffie","0365437689")); conteneur.add(new Personnel("Kidman","0187654356")); // insertion au rang 1 Personnel temp = new Personnel("Clooney","0132654387"); conteneur.add(0,temp); // Affichage du contenu du vecteur System.out.println("\n Caracteristiques (vecteur) : "); for (int i = 0; i < conteneur.size(); i++) { ((Personnel)conteneur.get(i)).affiche(); 1-191191 JAVA Christine BONNET
// Définition d'un itérateur Iterator it = conteneur.iterator(); // Affichage du contenu du vecteur par l'itérateur System.out.println("\n Caracteristiques (iterateur) : "); while (it.hasnext()) { ((Personnel)it.next()).affiche(); // Conversion du vecteur en un tableau de Personnel Personnel tabsalarie[]= new Personnel[conteneur.size()]; tabsalarie = (Personnel[])conteneur.toArray(tabSalarie); // Affichage du contenu du tableau System.out.println("\n Caracteristiques (tableau : "); for (int i = 0; i < tabsalarie.length; i++) { tabsalarie[i].affiche(); // Suppression de la référence sur le deuxième élément conteneur.remove(1); // Suppression en gardant une référence sur l'objet supprimé Personnel recup = (Personnel)conteneur.remove(1); System.out.println("\n Caracteristiques (recup) : "); recup.affiche(); 1-192192 JAVA Christine BONNET
// Recherche de l'occurrence d'un élément // Surcharge de equals dans Personnel // Utilisation de indexof int j = conteneur.indexof(temp); System.out.println("\n Le salarie est a la position : "+j); // tri du conteneur // Dans la classe Personnel, méthode compareto() Collections.sort(conteneur); // Affichage du contenu du vecteur System.out.println("\n Caracteristiques (trie) : "); for (int i = 0; i < conteneur.size(); i++) { ((Personnel)conteneur.get(i)).affiche(); // Vider totalement le conteneur conteneur.clear(); // fin main // fin classe TestVecteur 1-193193 JAVA Christine BONNET