Les fichiers texte en Java -...

21
Notes de cours Programmation I INF1120 Version 1.1 6 janvier 2017 Les fichiers texte en Java Mélanie Lord UQAM

Transcript of Les fichiers texte en Java -...

Notes de cours Programmation I

INF1120

Version 1.1 6 janvier 2017

Les fichiers texte en Java

Mélanie Lord UQAM

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

2

Table des matières

1.PAQUETAGEJAVA.IO 3

2.LECTUREDEFICHIERSTEXTE 42.1CLASSEFILEREADER 42.2CLASSEBUFFEREDREADER 52.3EXEMPLES 62.3.1LECTUREDEFICHIER,CARACTÈREPARCARACTÈRE 62.3.2LECTUREDEFICHIER,LIGNEPARLIGNE 9

3.ÉCRITUREDEFICHIERSTEXTE 103.1CLASSEFILEWRITER 103.2CLASSEPRINTWRITER 113.3EXEMPLES 12

4.AUTRESEXEMPLES(LECTUREETÉCRITURE) 14

5.CHEMINDEFICHIERRELATIFETABSOLU 14

6.LACLASSEFILE 15

7.EXERCICES 19

8.SOLUTIONSDESEXERCICES 20

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

3

1. Paquetage java.io Sans entrer dans les détails de ce qu’est un paquetage (pas dans le cadre du cours), vous devez savoir que le paquetage java.io contient les classes nécessaires pour manipuler les fichiers d’entrées (lecture de fichiers) et de sorties (écriture de fichiers). Ainsi, lorsqu’on utilise les fichiers dans nos programmes, il faut importer ce paquetage tout au début du programme (juste avant la déclaration de la classe), de cette manière : import java.io.*; //importe toutes les classes contenues dans le //paquetage java.io Les classes que nous utiliserons dans le cadre de ce cours (qui se trouvent dans le paquetage java.io) sont : Lecture fichier Écriture fichier

FileReader BufferedReader

FileWriter PrintWriter

Note : nous verrons aussi brièvement la classe File. On peut voir la manipulation de fichiers comme l’établissement d’un pipeline entre le programme et le fichier à lire ou à écrire. Dans le cas de la lecture d’un fichier, on peut imaginer que les caractères lus dans le fichier sont acheminés au programme par l’intermédiaire de ce pipeline (le flux de caractère va du fichier au programme). Dans le cas de la lecture d’un fichier, le flux de caractères va dans l’autre sens : du programme (qui fournit les caractères à écrire) au fichier à écrire. Les exceptions que nous aurons à gérer lors de la manipulation de fichiers texte sont les exceptions explicites IOException et FileNotFoundException (se trouvant aussi dans le paquetage java.io).

La hiérarchie ci-dessus indique que FileNotFoundException est une sous-classe de IOException.

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

4

2. Lecture de fichiers texte

2.1 Classe FileReader Constructeur public FileReader(String fileName) throws FileNotFoundException Crée un nouveau FileReader selon le nom du fichier donné en paramètre. Lance FileNotFoundException si le nom du fichier n’existe pas ou est un répertoire ou pour toute raison empêchant la lecture du fichier. Méthode public void close() throws IOException Ferme le flux et libère les ressources du système qui y sont associées. Lance IOException si une erreur quelconque d’entrée/sortie survient. Note : pour une liste plus exhaustive des constructeurs et méthodes de la classe FileReader, ainsi qu’une documentation plus détaillée, voir la Javadoc : http://docs.oracle.com/javase/7/docs/api/ Pour continuer avec la même analogie, on peut voir la création d’un objet FileReader comme étant l’établissement d’un pipeline entre le fichier à lire et le programme. Nous aurons besoin d’un autre objet pour permettre l’acheminement des caractères lus au programme… un BufferedReader. Exemple : création d’un objet FileReader et appel de la méthode close. FileReader ficALire; try { //Lecture du fichier ficEntree.txt se trouvant a la racine du projet ficALire = new FileReader("ficEntree.txt"); //FileNotFoundException //possible //instructions... ficALire.close(); //IOException possible } catch (FileNotFoundException fnfe) { System.out.println("Erreur d'entree/sortie !"); } catch (IOException ioe) { System.out.println("Erreur, le fichier ne peut pas etre lu !"); }

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

5

2.2 Classe BufferedReader Constructeur public BufferedReader(Reader in) Crée un flux d’entrée de caractères avec le lecteur donné. Méthodes public int read() throws IOException

§ Lit un seul caractère, et le retourne en tant qu’int. § Retourne -1 s’il n’y a plus de caractère à lire.

Lance IOException si une erreur quelconque d’entrée/sortie survient.

public String readLine() throws IOException

§ Lit une ligne complète du fichier. § Une ligne se termine par un des caractères suivant : '\n', '\r', ou par les deux caractères

"\r\n". § Retourne une chaine de caractères contenant les caractères de la ligne lue, sauf les

caractères de fin de ligne (: '\n', '\r', ou "\r\n").

§ Retourne null s’il n’y a plus de ligne à lire.

Lance IOException si une erreur quelconque d’entrée/sortie survient. public boolean ready() throws IOException

§ Spécifie si le flux est prêt à être lu (tampon de caractères non vide). Lance IOException si une erreur quelconque d’entrée/sortie survient. public void close() throws IOException Ferme le flux de données et libère les ressources du système lui étant associées. Lance IOException si une erreur quelconque d’entrée/sortie survient.

Note : pour une liste plus exhaustive des constructeurs et méthodes de la classe BufferedReader, ainsi qu’une documentation plus détaillée, voir la Javadoc : http://docs.oracle.com/javase/7/docs/api/

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

6

2.3 Exemples 2.3.1 Lecture de fichier, caractère par caractère Soit le fichier suivant : ficEntree.txt

Nous sommes en train de faire des exercices sur les fichiers texte. L'examen est bientôt. Ce texte est original.

Supposons que ficEntree.txt se trouve à la racine du projet. Supposons aussi la constante suivante : //chemin du fichier a lire (doit exister sur le disque) public final static String CHEMIN_FIC = "ficEntree.txt"; Exemple 1 : lecture des 3 premiers caractères de ficEntree.txt avec gestion locale des exceptions. public static void exempleLectureCar1() { FileReader ficALire; BufferedReader entree; char c; try { ficALire = new FileReader(CHEMIN_FIC); //FileNotFoundException //possible entree = new BufferedReader(ficALire); c = (char) entree.read(); //IOException possible System.out.println(c); c = (char) entree.read(); System.out.println(c); c = (char) entree.read(); System.out.println(c); entree.close(); ficALire.close(); } catch (FileNotFoundException fnfe) { System.out.println("Erreur, le fichier ne peut pas etre lu !"); } catch (IOException ioe) { System.out.println("Erreur d'entree/sortie !"); } }

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

7

Exemple 2 : lecture des 3 premiers caractères de ficEntree.txt avec gestion des exceptions différé. public static void exempleLectureCar2() throws IOException, FileNotFoundException { FileReader ficALire; BufferedReader entree; char c; ficALire = new FileReader(CHEMIN_FIC); //FileNotFoundException possible entree = new BufferedReader(ficALire); //lecture des trois premiers caracteres dans le fichier c = (char) entree.read(); //IOException possible System.out.println(c); c = (char) entree.read(); System.out.println(c); c = (char) entree.read(); System.out.println(c); entree.close(); ficALire.close(); } L’exécution de la méthode exempleLectureCar1 (ou exempleLectureCar2) affiche : N o u

Note : Dans la plupart des exemples de ce document, la gestion des exceptions sera différée pour insister sur la manipulation des fichiers plutôt que sur la gestion des exceptions. Exemple 3 : lecture de ficEntree.txt, caractère par caractère, jusqu’à la rencontre du caractère '\n' ou bien jusqu’à la fin du fichier si le fichier ne contient qu’une seule ligne. public static void exempleLectureCar3() throws IOException, FileNotFoundException { FileReader ficALire; BufferedReader entree; int c; ficALire = new FileReader(CHEMIN_FIC); entree = new BufferedReader(ficALire); //Lecture du premier caractere c = entree.read(); while (c != -1 && c != '\n') { System.out.print((char) c); c = entree.read(); } entree.close(); ficALire.close(); }

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

8

//version 2 avec la methode ready public static void exempleLectureCar3V2() throws IOException, FileNotFoundException { FileReader ficALire; BufferedReader entree; int c = 'x'; ficALire = new FileReader(CHEMIN_FIC); entree = new BufferedReader(ficALire); //lecture des caracteres suivants... jusqu'a '\n' ou la fin du //fichier (s'il n'y a qu'une seule ligne dans le fichier). while (entree.ready() && c != '\n') { c = entree.read(); if (c != '\n') { System.out.print((char) c); } } entree.close(); //fermeture du flux ficALire.close(); } L’exécution de la méthode exempleLectureCar3 ou exempleLectureCar3V2 affiche : Nous sommes en train de faire des

Exemple 4 : lecture du fichier ficEntree.txt, caractère par caractère, jusqu’à la fin du fichier. public static void exempleLectureCar4() throws IOException, FileNotFoundException { BufferedReader entree; int c; //creer entree en une seule ligne de code entree = new BufferedReader(new FileReader(CHEMIN_FIC)); while (entree.ready()) { c = entree.read(); System.out.print((char) c); } entree.close(); }

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

9

2.3.2 Lecture de fichier, ligne par ligne Exemple 5 : lecture et affichage des deux premières lignes du fichier ficEntree.txt. public static void exempleLectureLigne1() throws FileNotFoundException, IOException { BufferedReader entree = new BufferedReader(new FileReader(CHEMIN_FIC)); String ligne; ligne = entree.readLine(); //retourne null si rien a lire System.out.println(ligne); ligne = entree.readLine(); //retourne null si rien a lire System.out.println(ligne); entree.close(); } Exemple 6 : lecture et affichage de toutes les lignes du fichier ficEntree.txt. public static void exempleLectureLigne2() throws FileNotFoundException, IOException { String ligne; BufferedReader entree = new BufferedReader(new FileReader(CHEMIN_FIC)); while (entree.ready()) { ligne = entree.readLine(); System.out.println(ligne); } entree.close(); } Exemple 7 : utilisation des blocs try... finally public static void exempleTryFinally () throws IOException { BufferedReader in = null; try { in = new BufferedReader(new FileReader("fic1.txt")); //... } finally { if (in != null) { in.close(); //fermer le flux } } } Note : il est plus prudent de fermer le fichier (libérer les ressources) dans un bloc finally, mais dans le cadre de ce cours, vous n’avez pas à l’utiliser.

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

10

3. Écriture de fichiers texte

3.1 Classe FileWriter Constructeurs public FileWriter(String fileName) throws IOException Construit un objet FileWriter avec le nom de fichier donné. Si le fichier existe, il sera écrasé, sinon, il sera créé. Lance IOException si le nom de fichier donné est un répertoire, si le fichier donné n’existe pas, mais ne peut pas être créé, si le fichier existe, mais ne peut être ouvert. public FileWriter(String fileName, boolean append) throws IOException Construit un objet FileWriter avec le nom de fichier donné. Si le fichier existe, il sera écrasé (si append est false) ou le contenu à écrire sera ajouté à la suite du contenu du fichier (se append est true). Sinon si le fichier n’existe pas, il sera créé. Lance IOException si le nom de fichier donné est un répertoire, si le fichier donné n’existe pas, mais ne peut pas être créé, si le fichier existe, mais ne peut être ouvert. Méthode public void close() throws IOException Écrit le flux de données dans le fichier et le ferme ensuite en libérant les ressources du système qui y sont associées. Lance IOException si une erreur quelconque d’entrée/sortie survient. Note : pour une liste plus exhaustive des constructeurs et méthodes de la classe FileWriter, ainsi qu’une documentation plus détaillée, voir la Javadoc : http://docs.oracle.com/javase/7/docs/api/ Pour continuer avec la même analogie, on peut voir la création d’un objet FileWriter comme étant l’établissement d’un pipeline entre le fichier à écrire et le programme. Nous aurons besoin d’un autre objet pour permettre l’acheminement des caractères à écrire dans le fichier à écrire… un PrintWriter.

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

11

Exemple : création d’un objet FileWriter et appel de la méthode close. FileWriter ficAEcrire;; try { ficAEcrire = new FileWriter("ficSortie.txt"); //IOException //possible //instructions... ficAEcrire.close(); } catch (IOException ioe) { System.out.println("Erreur d'entree/sortie !"); } 3.2 Classe PrintWriter Constructeurs public PrintWriter(Writer out) Crée un nouveau PrintWriter avec le Writer donné. Méthodes public void print(...) Écrit dans le fichier ce qui est passé en paramètre. public void println() Écrit un saut de ligne dans le fichier. public void println(...) Écrit dans le fichier ce qui est passé en paramètre, puis un saut de ligne. public void close() Ferme le flux de données et libère les ressources du système lui étant associées. Note : pour une liste plus exhaustive des constructeurs et méthodes de la classe PrintWriter, ainsi qu’une documentation plus détaillée, voir la Javadoc : http://docs.oracle.com/javase/7/docs/api/

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

12

3.3 Exemples Soit la constante de classe suivante : //chemin du fichier a ecrire public final static String CHEMIN_FIC = "ficSortie.txt"; Exemple 1 : Écriture de différents types de variables dans le fichier ficSortie.txt. Exemple avec gestion locale des exceptions. public static void exempleEcriture1() { //constantes qu'on va ecrire dans le fichier final String s1 = "bizarre... "; final String s2 = "m'enfin!"; final int e = 234; final boolean b = true; final char c = 'f'; FileWriter ficAEcrire; PrintWriter sortie; try { ficAEcrire = new FileWriter(CHEMIN_FIC); //IOException possible sortie = new PrintWriter(ficAEcrire); //Ecriture dans le fichier ficSortie.txt //(s'il existe, il sera ecrase) sortie.print(s1 + b + " "); sortie.println(s2); sortie.println(e + " " + c); sortie.close(); //flush : c'est a ce moment que le contenu a //ecrire est envoye au fichier } catch (IOException ioe) { System.out.println("Erreur d'entree/sortie !"); } } La méthode exempleEcriture1 va créer/écraser le fichier ficSortie.txt avec les données suivantes : bizarre... true m'enfin! 234 f

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

13

Exemple 2 : Écriture de différents types de variables dans le fichier ficSortie.txt. Exemple avec gestion différée des exceptions. public static void exempleEcriture2() throws IOException { //constantes qu'on va ecrire dans le fichier final String s1 = "Il se peut que peut-etre "; final String s2 = "OK\n\n"; final int e = 1900; final boolean b = false; final char c = 'G'; FileWriter ficAEcrire = new FileWriter(CHEMIN_FIC); //IOException //possible PrintWriter sortie = new PrintWriter(ficAEcrire); //Ecriture dans le fichier ficSortie.txt //(s'il existe, sera ecrase) sortie.print(s1 + b + " "); sortie.println(s2); sortie.println(e + "" + c); sortie.close(); //flush : c'est a ce moment que le contenu a ecrire //est envoye au fichier } La méthode exempleEcriture2 va créer/écraser le fichier ficSortie.txt avec les données suivantes : Il se peut que peut-etre false OK 1900G

Exemple 3 : avec les blocs try... finally public static void exempleTryFinally () throws IOException { PrintWriter out = null; try { out = new PrintWriter(new FileWriter("fic2.txt")); //... } finally { if (out != null) { out.close(); } } } Note : il est plus prudent de fermer le fichier (libérer les ressources) dans un bloc finally, mais dans le cadre de ce cours, vous n’avez pas à l’utiliser.

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

14

Exemple 4 : Écriture en mode "append" public static void exempleEcriture3() throws IOException { //new FileWriter avec append egale true FileWriter ficAEcrire = new FileWriter(CHEMIN_FIC, true); PrintWriter sortie = new PrintWriter(ficAEcrire); //Ecriture dans le fichier ficSortie.txt : //si le fichier existe, le contenu sera ajoute a la fin //sinon le fichier sera cree. sortie.print("Ce contenu est ajoute a la suite..."); sortie.close(); //flush : c'est a ce moment que le contenu a ecrire //est envoye au fichier } En supposant que le fichier ficSortie.txt ait été créé par la méthode exempleEcriture2, le fichier ficSortie.txt résultant de l’appel de exempleEcriture3 sera : Il se peut que peut-etre false OK 1900G Ce contenu est ajoute a la suite...

4. Autres exemples (lecture et écriture) Voir (sur le site dans la section CONTENU DU COURS / Exemples vus en classe) :

FichierExempleAvecDimension.java FichierExempleCopierFichier.java FichierExempleAppliquerRabais.java

5. Chemin de fichier relatif et absolu Les exemples dans ce document supposent toujours que le ou les fichiers à lire se trouvent à la racine du projet (chemin relatif). Cependant, on peut spécifier au FileReader n’importe quel emplacement pour un fichier. On peut spécifier un chemin de fichier de manière absolue ou de manière relative. Chemin absolu Un chemin de fichier absolu contient toujours l’élément racine du système de fichier, ainsi que la liste complète des répertoires requis pour localiser le fichier. Toute l’information pour localiser le fichier est dans le chemin. Exemples :

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

15

Sur Mac : /Users/toto/Desktop/unFichier.txt (racine = /) Sur Unix : /home/toto/Desktop/unFichier.txt (racine = /) Sur Win : C:\Users\toto\Desktop\unFichier.txt (racine = C) Chemin relatif Un chemin relatif doit être combiné avec un autre chemin pour localiser le fichier. Par exemple, le chemin relatif "unFichier.txt" ne contient pas toute l’information pour localiser ce fichier. Il doit être combiné avec le chemin absolu de la racine du projet Java. Lorsqu’on utilise un fichier relatif, Java concatène le chemin de la racine du projet avec le chemin relatif donné : /chemin/dossier/projet/unFichier.txt Exemple : Supposons que le chemin absolu du répertoire du projet = /Users/toto/chemin/dossier/projet/ - Chemin relatif donné = mesFichiers/fichier.txt - Chemin absolu correspondant = /Users/toto/chemin/dossier/projet/mesFichiers/fichier.txt 6. La classe File La classe File permet de créer une représentation abstraite d’un chemin de fichier ou répertoire. Elle se trouve aussi dans le paquetage java.io. Constructeur public File(String pathname)

§ Crée une nouvelle instance de File en convertissant la chaine de caractère du chemin de fichier/répertoire donnée en un chemin de fichier/répertoire abstrait (File).

§ Si le pathname donné est une chaine vide, le résultat est un chemin abstrait vide.

Lance NullPointerException si pathname est null. Aperçu de quelques méthodes public boolean delete()

§ Supprime le fichier ou répertoire représenté par cet objet File. § Si le chemin dénote un répertoire, celui-ci doit être vide pour être supprimé.

§ Retourne true si et seulement si le fichier/répertoire a été supprimé.

Lance SecurityException… (voir Javadoc)

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

16

public boolean exists()

§ Teste si le fichier ou répertoire représenté par cet objet File existe.

§ Retourne true si et seulement si le fichier/répertoire existe. Retourne false sinon.

Lance SecurityException… (voir Javadoc) public String getAbsolutePath() Retourne le chemin absolu de cet objet File sous forme de chaine de caractères. Lance SecurityException… (voir Javadoc) public String getName() Retourne le nom du fichier ou répertoire représenté par cet objet File (seulement le dernier nom dans la séquence de noms composant le chemin). public String getParent() Retourne le chemin du dossier parent de cet objet File, sous forme de chaine de caractères ou null si cet objet File ne nomme aucun parent. public File getParentFile() Retourne un nouvel objet File représentant le chemin du dossier parent de cet objet File ou null si cet objet File ne nomme aucun parent. public boolean isDirectory()

§ Teste si cet objet File est un répertoire (et non un fichier).

§ Retourne true si et seulement si cet objet File représente un répertoire qui existe, false sinon.

Lance SecurityException… (voir Javadoc) public boolean isFile()

§ Teste si cet objet File est un fichier (et non un répertoire).

§ Retourne true si et seulement si cet objet File représente un fichier qui existe, false sinon.

Lance SecurityException… (voir Javadoc)

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

17

public String[] list()

§ Retourne un tableau de chaines de caractères contenant le nom (pas le chemin) de tous les fichiers et répertoires qui se trouvent dans le répertoire représenté par cet objet File.

§ Si cet objet File ne représente pas un répertoire, cette méthode retourne null.

Lance SecurityException… (voir Javadoc) public File[] listFiles()

§ Retourne un tableau d’objets File représentant le nom (pas le chemin) de tous les fichiers et répertoires qui se trouvent dans le répertoire représenté par cet objet File.

§ Si cet objet File ne représente pas un répertoire, cette méthode retourne null.

Lance SecurityException… (voir Javadoc) public boolean mkdir()

§ Crée sur le disque le répertoire représenté par cet objet File.

§ Retourne true si et seulement si le répertoire a été créé, false sinon.

Lance SecurityException… (voir Javadoc) public boolean mkdirs()

§ Crée sur le disque, le répertoire représenté par cet objet File, incluant les répertoires parents nécessaires, s’ils n’existent pas.

§ Retourne true si et seulement si le répertoire a été créé avec tous les répertoires parents inexistants, false sinon.

Lance SecurityException… (voir Javadoc) Note : pour une liste plus exhaustive des constructeurs et méthodes de la classe File, ainsi qu’une documentation plus détaillée, voir la Javadoc : http://docs.oracle.com/javase/7/docs/api/ Il existe aussi des constructeurs qui permettent de créer des objets FileReader et FileWriter en donnant en paramètre un objet File plutôt qu’une chaine de caractères représentant le chemin du fichier (voir à la fin des exemples suivants).

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

18

Exemples d’utilisation des méthodes de la classe File : import java.io.*; public class FichierExempleAvecFile { //MODIFIER les chemins pour des chemins existants sur votre disque. //un fichier et un repertoire existants sur le disque //(chemins relatifs, mais pourraient etre absolus) public static final String FILE_PATH = "fichiers/exemples/fic1.txt"; public static final String DIR_PATH = "fichiers/exemples/"; public static void main (String [] args) throws IOException { FileReader ficEntree; FileWriter ficSortie; String [] tab; File fic = new File (FILE_PATH); File dir = new File (DIR_PATH); System.out.println(fic.isFile()); //true System.out.println(fic.isDirectory()); //false System.out.println(dir.isFile()); //false System.out.println(dir.isDirectory()); //true System.out.println(fic.exists()); //true System.out.println(dir.exists()); //true System.out.println(fic.getAbsoluteFile()); //affiche le chemin absolu System.out.println(dir.getAbsoluteFile()); //affiche le chemin absolu System.out.println(fic.getName()); //fic1.txt System.out.println(dir.getName()); //exemples System.out.println(fic.getParent()); //fichiers/exemples System.out.println(dir.getParent()); //fichiers tab = dir.list(); for (String s : tab) { //affiche tous les fichiers et repertoires System.out.println(s); //qui sont dans DIR_PATH } //creation de FileReader avec un objet File : ficEntree = new FileReader(fic); //creation de FileWriter avec un objet File : ficSortie = new FileWriter(fic); } }

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

19

7. Exercices Exercice 1 Écrivez un programme (une méthode main) qui lit le fichier ficEntree.txt (voir section 2.3.1) et qui compte le nombre de caractères 'e' dans ce fichier, puis affiche le résultat à l'écran. Si une exception est levée, le programme doit écrire un message d'erreur (différent selon le type de l’exception) et se terminer. Exercice 2 Écrivez un programme qui lit le fichier ficEntree.txt (voir section 2.3.1) et qui recopie dans l’ordre et sur une même ligne, toutes les voyelles minuscules contenues dans ce fichier, dans un autre fichier nommé voyelles.txt. Si une exception est levée, le programme doit écrire un message d'erreur (différent selon le type de l’exception) et se terminer. Exercices 3 Écrivez une méthode nommée selectionner qui prend en paramètre un entier représentant le mois d’une date. Votre méthode doit lire le fichier dates.txt (qui contient une date par ligne) et recopier, dans un fichier nommé selection.txt, toutes les dates qui ont le mois donné en paramètre. Chaque date, dans le fichier dates.txt, est écrite sous le format AAAAMMJJ, mais il peut y avoir des espaces superflues avant ou après la date. Au moment de la recopie, votre méthode doit enlever ces espaces superflues. Exemple d’un fichier dates.txt : 20080402 20071107 20060506 20040427 20040317 20060823 19990418 20040415 19981212 20080214

L’appel de la méthode selectionner(4) devrait produire le fichier selection.txt suivant :

20080402 20040427 19990418 20040415

Si une exception quelconque se produit, la méthode doit afficher le message d’erreur "ERREUR !" et se terminer.

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

20

8. Solutions des exercices Exercice 1 import java.io.*; public class FichierExercice1 { public static void main(String[] params) { BufferedReader in; int c; int cpt = 0; try { in = new BufferedReader(new FileReader("ficEntree.txt")); //Lire le fichier caractère par caractère while (in.ready()) { c = in.read(); if ((char)c == 'e') { cpt++; //compter les 'e' } } in.close(); //fermer le flux //afficher le nombre de 'e' System.out.println("Nombre de lettres 'e' : " + cpt); } catch (FileNotFoundException e) { System.out.println("Le fichier ne peut etre lu."); } catch (IOException e) { System.out.println("Erreur d'entree / sortie."); } } } Exercice 2 import java.io.*; public class FichierExercice2 { public static void main(String[] params) { BufferedReader in; PrintWriter out; char car; try { in = new BufferedReader(new FileReader("ficEntree.txt")); out = new PrintWriter(new FileWriter("voyelles.txt")); //Lire le fichier caractere par caractere while (in.ready()) { car = (char)(in.read()); if (car == 'a' || car == 'e' || car == 'i' || car == 'o' || car == 'u' || car == 'y') { out.print(car); //afficher les voyelles minuscules } } in.close(); //fermer les flux out.close();

Programmation I – INF1120 Les fichiers texte

Mélanie Lord [email protected]

21

} catch (FileNotFoundException e) { System.out.println("Le fichier ne peut etre lu."); } catch (IOException e) { System.out.println("Erreur d'entree / sortie."); } } } Exercice 3 import java.io.*; public class FichierExercice3 { public static String FIC_ENTREE = "dates.txt"; public static String FIC_SORTIE = "selection.txt"; public static void selectionner(int mois) { BufferedReader in; PrintWriter out; String ligne; try { in = new BufferedReader(new FileReader(FIC_ENTREE)); out = new PrintWriter(new FileWriter(FIC_SORTIE)); while (in.ready()) { ligne = in.readLine().trim(); if (Integer.parseInt(ligne.substring(4, 6)) == mois) { out.println(ligne); } } in.close(); out.close(); } catch (Exception e) { System.out.println("Erreur!"); } } }