Les fichiers en java Les fichiers en Java 1. L’écriture en mode texte brut les informations sont écrites en claires, séparées par un séparateur quelconque défini par l’utilisateur utilisable par n’importe quelle application nécessite un parsing à l'arrivée pour analyser les données 4 classes "mères", abstraites, pour traiter les flots de données héritant directement d'Object : pour traiter de flots d'octets o la classe InputStream o la classe OutputStream pour traiter de flots de caractères o la classe Reader o la classe Writer La classe FileReader permet de lire des caractères dans un fichier. La classe FileWriter permet d'écrire des caractères dans un fichier. Problématique : comment sauvegarder (ou transporter) un objet sachant qu’il est composé d’instance d’autres objets, c’est à dire, que tout un graphe d’instances lui est associé. 2. 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. la sérialisation, c'est lire/écrire un objet dans un flot (flux) Brigitte Groléas Les fichiers en java La sérialisation Lecture et écriture d’objets dans un fichier, sur un flux, sur un stream en général Un objet serialisable est transformable en une suite séquentiel d'octets. o en Java, au niveau de l'objet, il suffit d'implémenter l'interface Serializable (qui n'a pas de méthode) o de tels flots en Java sont : 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() les classes FileInputStream et FileOutputStream : o sont des sous-classes de respectivement InputStream et OutputStream o sont des flots (flux) pour la lecture/écriture des octets o permettent d'accéder à des fichiers sur disque o instancie un flot à partir d'un objet File Brigitte Groléas Les fichiers en java Lire et écrire un texte dans le fichier FileWriter fw; fw = new FileWriter( "c:/titio.txt",true); // true pour ouvrir en ajout fw.write( "velo\n"); fw.close(); /////////////////// System.out.println("lecture car par car"); FileReader reader = new FileReader("c:/titio.txt"); int lu; char c; 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(); }catch (Exception e) { } ////////////////// System.out.println("lecture ligne à ligne"); FileReader fr = new FileReader( "c:/titio.txt"); BufferedReader br = new BufferedReader(fr); // pour ligne ligne à ligne String s = br.readLine() ; System.out.println(s); fr.close(); Lire et écrire un token dans le fichier Lire des entiers dans un fichier ne contenant que des entiers. int somme = 0; FileReader f = new FileReader("c:/titi.txt"); // Le fichier titi.txt contient 12 13 22 44 33 22 StreamTokenizer truc = new StreamTokenizer(f); // découpe le fichier en truc while(truc.nextToken() == StreamTokenizer.TT_NUMBER) { // S'arrete au premier non chiffre rencontré somme += (int)truc.nval; } f.close(); System.out.println(somme); Brigitte Groléas Les fichiers en java La classe File //////////////////// System.out.println("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"); //////////////////// System.out.println("recuperer le nom sans le chemin"); File file = new File("c:/titio.txt"); System.out.println(file.getName());//affiche titio.txt //////////////////// System.out.println(" renommer un fichier"); File nouveauNom=new File("c:/suiv.txt"); file.renameTo(nouveauNom); // le fichier doit être fermé pour que ca fonctionne ////////////////////// System.out.println("Lister les fichiers d'un répertoire"); File repertoire = new File("c:/"); String[] listeFichiers; listeFichiers=repertoire.list(); for (int i=0;i < listeFichiers.length;i++) System.out.println(listeFichiers[i]); ///////////// Fenêtre de choix JFileChooser dialogue = new JFileChooser(); if (dialogue.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { // dialogue.showOpenDialog(null) fenetre modale de saisie // peut retourner APPROVE_OPTION ou CANCEL_OPTION File fichier = dialogue.getSelectedFile(); // FileWriter ecrire = new FileWriter(fichier.getPath(), true); FileWriter ecrire = new FileWriter(fichier); ecrire.write("cerise"); ecrire.close(); } System.exit(0); Brigitte Groléas Les fichiers en java Lire les 20 premiers octets du fichier titi et les afficher à l’écran package fichier; import java.io.*; public class Fic { public static void main (String [ ] args) { try { // Ouverture du fichier titi InputStream fluxFichier = new FileInputStream ("c:/titi.txt"); byte contenuFichier [ ] = new byte [20]; // Lecture des 20 premiers octets fluxFichier.read (contenuFichier); System.out.println (new String (contenuFichier)); fluxFichier.close (); // Fermeture du fichier } catch (IOException e) { System.out.println (e); } } } RandomAccessFile Fichier à accès aléatoire Vous devez connaître la taille et la position de l’enregistrement. Mais cette taille n’est pas nécessairement identique pour tous les enregistrements. Constructeurs : RandomAccessFile(File f, String mode) RandomAccessFile(String n, String mode) Mode = "r" Ouverture en lecture seule "rw" Ouverture en lecture/écriture. Si le fichier n'existe pas, on essaie de le créer. "rws" Ouverture en lecture/écriture. La mise à jour du contenu du fichier et de ses méta données est faite de façon synchrone. "rwd" Ouverture en lecture/écriture. La mise à jour du contenu du fichier est faite de façon synchrone. long getFilePointer() pour trouver où on se trouve dans le fichier void seek(long pos) pour se déplacer vers un nouvel emplacement dans le fichier Brigitte Groléas Les fichiers en java long length() pour déterminer la taille maximum du fichier int read() Lit un octet int read(byte[] b) Lit b octets et les range dans b int read(byte[] b, int d, int l) Lit l octets et les range dans b à partir de d. boolean readBoolean() Lit un booléen. byte readByte() Lit un octet. char readChar() Lit un caractère. int readInt() Lit un int. String readLine() Lit jusqu’au retour à la ligne int skipBytes(int n) Avance de n octets, renvoie le nbre réel d'octets sautés. void write(byte[] b) Ecrit le tableau d'octetsb. void write(byte[] b, int d, int l) Ecrit l octets du tableau d'octets b, à patir de d. void write(int b) Ecrit l'octet de droite contenu dans b. void writeBoolean(boolean v) Ecrit le booléen v. void writeByte(int v) Ecrit l'octet v. void writeChar(int v) Ecrit le caractère contenu dans v. void writeInt(int v) Ecrit l'entier v. void writeBytes(String s) Ecrit la chaîne sous la forme d'une suite d'octets void writeChars(String s) Ecrit la chaîne de caractères. //////////////// Ecrit et relit 3 lignes dans un fichier RandomAccessFile out = new RandomAccessFile ("c:/tit.txt","rw"); out.writeBytes("couou\nzz\n"); out.seek(0l); String s = out.readLine(); System.out.println("la chaine 1 "+s); s = out.readLine(); System.out.println("la chaine 2 "+s); s = out.readLine(); System.out.println("la chaine 3 "+s); out.close(); Lire et écrire un objet dans le fichier import java.io.*; public class Fich { static Date tab[]; static Date tab2[]; public static void main(String[] args) throws Exception { Brigitte Groléas Les fichiers en java tab = new Date[5]; tab[0]= new Date (10,12,2004,"septembre"); tab[1] = new Date (1,2,2004,"septembre"); tab[2] = new Date (1,11,2004,"octobre"); tab[3] = new Date (4,9,2004,"septembre"); tab[4]= new Date (21,2,2003,"sssse"); tab2 = new Date[5]; FileOutputStream fichier = new FileOutputStream("c:/essai"); try { ObjectOutputStream flotEcriture = new ObjectOutputStream(fichier); for (int i=0; i<5; ++i) flotEcriture.writeObject(tab[i]); flotEcriture.close(); } catch (IOException e) { System.out.println(" erreur :" + e.toString()); } System.out.println ( "lecture"); FileInputStream fichier2 = new FileInputStream("c:/essai"); try { 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(); }catch (Exception e) { System.out.println(" erreur :" +e.toString()); } for (int i=0; i<5; ++i) tab2[i].affiche(); } } Brigitte Groléas