Qu est-ce qu un flux ? (1) • Objectifs : Réception et envoie de données (séquentielles) API Java sur les flux Master Informatique 1ère année Objet Flux Source (données) Julien Velcin http://mediamining.univ-lyon2.fr/velcin Destination Entrée Sortie • Données : binaires ou caractères 0,0,1,0,0,0,1,1,0,1… Qu est-ce qu un flux ? (2) Destination Entrée Sortie • Description : 0,0,1,0,0,0,1,1,0,1… A,b,?, ,\n,B,o,n,j,o… binaire caractères Entrée Sortie InputStream OutputStream Reader Writer Note : Préfixez File pour la gestion des fichiers. Fichiers de caractères FileReader & FileWriter • Instanciation : Objet Flux Source (données) A,b,?, ,\n,B,o,n,j,o… FileReader r = new FileReader("test.txt"); FileWriter w = new FileWriter("test.txt",true); • Lecture/écriture : ou une adresse absolue (ex. sous windows : "c:\\rep\test.txt") int c = r.read(); r.read(char[] s); r.read(char[] s, int debut, int longueur); w.write(int c); w.write(char[] s, int debut, int longueur); w.write(String s, int début, int longueur); • Fermeture : r.close(); w.close(); Flux : le tampon • Objectif : Faciliter l Fichier binaire objet (1) accès au flux, briser la « séquentialité ». ObjectOutputStream FileOutputStream Flux Caractères tampon Flux Fichier Objet Fichier tampon Note : préfixez Buffered pour obtenir un tampon. BufferedReader br = new BufferedReader(r); BufferedWriter bw = new BufferedWriter(w); String s = br.readLine(); bw.newLine(); bw.flush(); bw.close(); Fichier binaire objet (2) • Lecture d objet : try { FileInputStream r = new FileInputStream("test.dat"); ObjectInputStream o = new ObjectInputStream(r); Object lu = o.readObject(); mon_objet = (MaClasse)lu; o.close(); r.close(); } catch (Exception e) { System.out.println(“Erreur d’entrée-sortie”); } ObjectInputStream FileInputStream Fichier binaire objet (3) Ecriture d objet : Object ecrit = new Object(); (…) try { FileOutputStream w = new FileOutputStream("test.dat"); ObjectOutputStream o = new ObjectOutputStream(w); o.writeObject(ecrit); o.close(); w.close(); } catch (Exception e) { System.out.println(“Erreur d’entrée-sortie”); } Fichier binaire objet (4) Fichier binaire objet (5) Exemple Exemple (suite) public class Alcool { public double degre; public String nom; public class Bar { public TreeSet les_liquides; public Coktail en_melangeant(JusDeFruit jus) { … } public void enregistrer() { try { FileOutputStream w = new FileOutputStream("test.dat"); ObjectOutputStream o = new ObjectOutputStream(w); o.writeObject(les_liquides); o.close(); w.close(); } catch (Exception e) { System.out.println(“Erreur d’IO”); } } public class Bar { public TreeSet les_liquides; public void enregistrer() { … } } public static void main( … ) { … Bar b = new Bar(); … b.enregistrer(); } Fichier binaire objet (6) • Très important : } Exemple (suite) import import import public • Signature des méthodes : private void writeObject(java.io.ObjectOutputStream out) throws IOException { out.defaultWriteObject(); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); } Implémentation optionnelle ! Pour être écrit dans un fichier, un objet (et les objets qu il utilise) doit implémenter l interface serializable. } java.io.Serializable; java.io.FileOutputStream; java.io.ObjectOutputStream; class Bar implements Serializable { public TreeSet les_liquides; public void enregistrer() { FileOutputStream w = new FileOutputStream("test.dat"); ObjectOutputStream o = new ObjectOutputStream(w); o.writeObject(les_liquides); o.close(); w.close(); } private void writeObject(java.io.ObjectOutputStream out) throws IOException { out.defaultWriteObject(); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); } Exemple (suite) public class Alcool implements Serializable { public double degre; public String nom; Implémentation optionnelle ! public Coktail en_melangeant(JusDeFruit jus) { … } } private void writeObject(java.io.ObjectOutputStream out) throws IOException { out.defaultWriteObject(); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); }