•Flux de données •Lecture/Ecriture Fichiers 1 Un flux de données est un objet qui représente une suite d’octets d’un programme pour une certaine destination ou issus d’une source pour un programme flux d’entrée (input stream): données vers le programme flux de sortie (output stream): données issues du programme •flux d’entrée à partir du clavier System.in Scanner keyboard = new Scanner(System.in); •flux de sortie vers l’écran ou un fichier System.out System.out.println("Output stream"); 2 •Classe PrintWriter est un flux de sortie (output stream) pour écrire sur un fichier de texte méthodes print, println similaires de la classe System.out import java.io.PrintWriter; import java.io.FileOutputStream; import java.io.FileNotFoundException; PrintWriter fluxSortie; fluxSortie = new PrintWriter( new FileOutputStream(fichierNom)); Constructeur FileOutputStream prend comme argument un objet String qui est le nom du fichier de Constructeur PrintWriter prend un objet anonyme de classe FileOutputStream 3 On obtient un objet PrintWriter connecté au fichier texte fichierNom Ouverture du fichier fichierNom • si le fichier existe le contenu est écrasé • si le fichier n’existe pas un nouveau fichier est crée Concaténer: fluxSortie =new PrintWriter( new FileOutputStream(fichierNom,true)); Ecriture avec print, println: fluxSortie.println(“une chaine de caracteres” ); 4 import java.io.PrintWriter; import java.io.FileOutputStream; import java.io.FileNotFoundException; public class TextFileOutputDemo { public static void main(String[] args) { PrintWriter fluxSortie = null; try { fluxSortie = new PrintWriter(new FileOutputStream("fichier.txt")); } catch(FileNotFoundException e) { System.out.println("Erreur d’ouverture fichier.txt."); System.exit(0); } System.out.println("Ecriture sur fichier"); fluxSortie.println(" Premiere ligne du fichier "); fluxSortie.println(" Deuxiemeligne du fichier."); fluxSortie.close( ); System.out.println("Fin du programme."); } } 5 Classe Scanner pour lire à partir d’un fichier texte import java.util.Scanner; import java.io.FileInputStream; import java.io.FileNotFoundException; Lecture à partir du fichier standard d’entrée (clavier): Scanner fluxEntree =new Scanner(System.in); Lecture à partir du fichier fluxEntree: Scanner fluxEntree = new Scanner(new FileInputStream(fichierNom)); Les mêmes méthodes que la classe Scanner fluxEntree.nextInt(), fluxEntree.nextLine(), fluxEntree.nextDouble(), fluxEntree.nextLong().... fluxEntree.hasNextLine(), fluxEntree.hasNextInt() ... retourne un boolean 6 import import import import import java.util.Scanner; java.io.FileInputStream; java.io.FileNotFoundException; java.io.PrintWriter; java.io.FileOutputStream; public class DemoIO { public static void main(String[] args) { Scanner fluxEntree = null; PrintWriter fluxSortie = null; try { fluxEntree = new Scanner(new FileInputStream("original.txt")); fluxSortie= new PrintWriter( new FileOutputStream("numerote.txt")); } catch(FileNotFoundException e) { System.out.println("Erreur ouverture fichier."); System.exit(0); } String ligne = null; int no = 0; while (fluxEntree.hasNextLine( )) { ligne = fluxEntree.nextLine( ); no++; fluxSortie.println(no + " " + ligne); } fluxEntree.close( ); fluxSortie.close( ); } } 7 Classe BufferedReader pour lire à partir d’un fichier méthodes: read and readLine import java.io.BufferedReader; import java.io.FileReader; import java.io.FileNotFoundException; import java.io.IOException; ouverture du fichier texte: BufferedReader lectObj; lectObj= new BufferedReader(newFileReader(FichierNom)); readline lire une chaine de charactères (null si EOF) read lire un char (-1 si EOF) retourne un entier il faut convertir char next = (char)(lectObj.read()); readline, read peuvent lancer IOException 8 . readline retourne null si EOF . read retourne -1 si EOF Lecture des nombres: 1) readline(), 2) Integer.parseInt(), Double.parseDouble(), ... 9 import import import import java.io.BufferedReader; java.io.FileReader; java.io.FileNotFoundException; java.io.IOException; public class TextFileInputDemo { public static void main(String[] args) { try {BufferedReader fluxEntree= new BufferedReader(new FileReader("donnee.txt")); String ligne = fluxEntree.readLine( ); System.out.println(" Premiere ligne:"); System.out.println(ligne); ligne = fluxEntree.readLine( ); System.out.println(" Seconde ligne:"); System.out.println(ligne); fluxEntree.close( ); } catch(FileNotFoundException e) { System.out.println(" Fichier donnee nexiste pas"); System.out.println("ou erreur ouverture");} catch(IOException e) { System.out.println("Erreur lecture donnee.txt.");} } } 10 Classe File est une classe pour les noms de fichiers File fichierObj =new File( “donnees“); if ( fichierObj.exists()) System.out.println(“fichier existe“); if (fichierObj.canRead()) System.out.println(“pas lisible“); 11 Copyright © 2008 Pearson Addison-Wesley. All rights reserved 12 Copyright © 2008 Pearson Addison-Wesley. All rights reserved 13 Copyright © 2008 Pearson Addison-Wesley. All rights reserved 14 Copyright © 2008 Pearson Addison-Wesley. All rights reserved 15 Fichiers Binaires Java sont portables lecture ObjectInputStream import java.io.ObjectInputStream; import java.io.FileInputStream; import java.io.IOException; ObjectInputStream fluxObj= new ObjectInputStream( new FileInputStream(fichierNom)); – constructeur FileInputStream peut lancer FileNotFoundException – constructeur ObjectInputStream peut lancer IOException –méthodes : readInt, readDouble, readChar, readBoolean readUTF pour String -il faut fermer le flux après lecture: close -lance EOFException si c’est la fin du fichier 16 – writeObject pour écrire un objet –readObject pour lire un objet – uneClasse unObjet=(uneClasse) fluxObj.readObject(); –les objets doivent appartenir à une classe qui implémente l’interface Serializable cette interface n’a aucune méthode, aucune constante si la classe a des objets comme attributs, il faut que ces classes soient aussi Serializable - il vaut mieux sauvegarder les objets d’une même classe 17 import java.io.ObjectOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class BinaryOutputDemo { public static void main(String[] args) { try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream( "donne.dat")); int i; for (i = 0; i < 5; i++) out.writeInt(i); System.out.println(" on ecrit dans donne.dat."); out.close( ); } catch(IOException e) { System.out.println("Probleme fichier sortie."); } } } 18 import import import import java.io.ObjectInputStream; java.io.FileInputStream; java.io.IOException; java.io.FileNotFoundException; public class BinaryInputDemo { public static void main(String[] args) {try { ObjectInputStream in= new ObjectInputStream(new FileInputStream(" donne.dat")); int n1 = in.readInt( ); int n2 = in.readInt( ); System.out.println("ce qu’on a lus :"); System.out.println(n1); System.out.println(n2); in.close( ); } catch(FileNotFoundException e) { System.out.println( "Erreur donne.dat.");} catch(IOException e) {System.out.println("Problemes donnees dans donne.dat.");} System.out.println( " Fin du programme"); } } 19