STREAMS (et fichiers)
OBJECTIFS Lire et écrire des fichiers Être familier avec les concepts de fichiers textes et binaires Lire et écrire des objets avec la sérialisation Apprendre à traiter la ligne de commandes Savoir distinguer et utiliser les fichiers séquentiels et aléatoires (à accès direct) 4/26/2019 IFT1020
CODES TestFichierTexte.java (digits) TestBouquet.java (objets sérialisables) 4/26/2019 IFT1020
Deux manières de sauver des données Format texte Format binaire 4/26/2019 IFT1020
Format texte Lisible par l’humain Séquences de caractères Stockage des entiers avec des caractères: 12345 en fait ‘1’ ’2’ ’3’ ’4’ ’5’ Dans ce cas, utilisez les classes Reader et Writer ainsi que leurs sous-classes 4/26/2019 IFT1020
Format binaire Plus compact et efficace Les entiers sont stockés avec leur repésentation binaire, 00 00 48 57… Dans ce cas, utilisez InputStream et OutputStream ainsi que leurs sous-classes 4/26/2019 IFT1020
Lire des données textes sur fichier Créer un FileReader Utilisez sa méthode read pour lire un caractère à la fois retourne le caractère suivant dans un int ou l’entier -1 si à la fin du fichier Il faut donc tester pour -1 Si n’est pas -1, caster dans un char Fermer le fichier quand c’est terminé 4/26/2019 IFT1020
Code pour lire un caractère sur disque FileReader lecteur = new FileReader(“donnees.txt"); int suivant = reader.read(); char c; if(suivant != -1) c = (char)suivant; ... reader.close(); 4/26/2019 IFT1020
Code pour écrire un caractère sur le disque FileWriter scripteur = new FileWriter(“donnees.txt"); ... char c=''; ... scripteur.write(c); ... scripteur.close(); 4/26/2019 IFT1020
Pour lire des données binaires sur disque Créer un FileInputStream Utilisez sa méthode read pour lire un byte retourne le prochain byte dans un int ou l’entier -1 à la fin du fichier Il faut donc tester pour -1 Si non -1, caster dans un byte Fermer le fichier quand terminé 4/26/2019 IFT1020
Code pour lire un byte du disque FileInputStream fluxEntree = new FileInputStream(“donnees.dat"); int suivant = fluxEntree.read(); byte b; if(suivant != -1) b = (byte)suivant; ... fluxEntree.close(); 4/26/2019 IFT1020
Code pour écrire un byte sur disque FileOutputStream fluxSortie = new FileOutputStream(“donnees.txt"); ... byte b = 0; ... fluxSortie.write(b); ... fluxSortie.close(); 4/26/2019 IFT1020
Écrire des fichiers de textes Utiliser un PrintWriter pour Briser les nombres et chaînes en des caractères individuels Les envoyer un à la fois vers un FileWriter Code pour créer un PrintWriter FileWriter scripteur = new FileWriter(“donnees.txt”) PrintWriter sortie = new PrintWriter(scripteur); 4/26/2019 IFT1020
Écrire des fichiers textes Utilisez print et println pour imprimer des nombres, objets ou chaînes sortie.println(29.95); sortie.println(new Rectangle(5,10,15,25)); sortie.println(“Bonjour!"); 4/26/2019 IFT1020
Lire des fichiers textes Utilisez un BufferedReader Soit lire un caractère à la fois à partir d’un FileReader Soit assembler les caractères dans une ligne et la retourner Pour convertir des chaînes en nombres, utilisez Integer.parseInt Integer.parseDouble 4/26/2019 IFT1020
Lire des fichiers textes Code pour lire un fichier texte FileReader lecteur = new FileReader(“donnees.txt"); BufferedReader entree = new BufferedReader(lecteur); String ligneEntree = entree.ReadLine(); double x = Double.parseDouble(ligneEntree); 4/26/2019 IFT1020
Allons voir le code de TestFichierTexte.java… 4/26/2019 IFT1020
La classe et le dialogue de fichiers La classe File décrit des fichiers ou des répertoires sur disque Créer un objet File File fichier = new File("donnees.txt"); Un objet de la classe File ne s’utilise pas directement. Il faut « le passer » à un lecteur ou à un scripteur, ou bien à un stream. 4/26/2019 IFT1020
La classe File Quelques méthodes de la classe File : delete renameTo exists Construire un FileReader à partir d’un objet File : FileReader lecteur = new FileReader(fichier); 4/26/2019 IFT1020
Dialogue de fichiers… Utilisez JFileChooser pour laisser un utilisateur fournir un nom de fichier à travers un dialogue GUI Pour construire un objet JFileChooser, il faut appeler sa méthode showOpenDialog ou showSaveDialog Il faut spécifier null ou la composante GUI dans laquelle faire apparaître le dialogue 4/26/2019 IFT1020
Dialogue de fichiers Si l’utilisateur choisit un fichier: JFileChooser.APPROVE_OPTION est retournée Si l’utilisateur annule la sélection: JFileChooser.CANCEL_OPTION est retournée Si un fichier est choisi, utilisez la méthode GetSelectedFile pour obtenir un objet File qui décrit le fichier 4/26/2019 IFT1020
Le dialogue JFileChooser 4/26/2019 IFT1020
Code pour utiliser un JFileChooser JFileChooser selecteur = new JFileChooser(); FileReader entree = null; if(selecteur.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { File fichier = selecteur.getSelectedFile(); entree = new FileReader(fichier); } 4/26/2019 IFT1020
Arguments de la ligne de commandes On lance un programme de la ligne de commandes On spécifie les arguments après le nom du programme Dans le programme, on accède et traite les chaînes des paramètres de qui se retrouvent dans l’argument args de la méthode main 4/26/2019 IFT1020
Exemple d’une ligne de commandes Java MonProgramme -d fichier.txt class MyProgram { public static void main(String[] args) { ... } args[0] "-d" args[1] "fichier.txt" 4/26/2019 IFT1020
Streams d’objets La classe ObjectOutputStream sert à sauver des objets sur disque La classe ObjectInputStream sert à lire des objets sur disque Les objets sont sauvés en format binaire 4/26/2019 IFT1020
Écrire un objet Baloune sur un fichier Baloune b = ...; ObjectOutputStream sortie = new ObjectOutputStream( new FileOutputStream(“balounes.dat")); sortie.writeObject(b); 4/26/2019 IFT1020
Lire un objet Baloune d’un fichier ObjectInputStream entree = new ObjectInputStream(new FilInputStream(“balounes.dat")); Baloune b = (Baloune)entree.readObject(); La méthode readObject peut lancer (throw) une exception de type ClassCastException Vous devez l’attraper (catch) ou la déclarer 4/26/2019 IFT1020
Écrire et lire un ArrayList sur fichier ArrayList a = new ArrayList(); //ajouter des objets à la liste sortie.writeObject(a); Lire ArrayList a = (ArrayList)entree.readObject(); 4/26/2019 IFT1020
L’interface Serializable Les objets qu’on écrit sur un stream d’objets doivent appartenir à une classe qui implante l’interface Serializable class Baloune implements Serializable { ... } L’interface Serializable ne contient aucune méthode. 4/26/2019 IFT1020
Allons voir le code Bouquet.java… 4/26/2019 IFT1020
Accès séquentiel et aléatoire Sequentiel Un fichier est traiter dans l’ordre un byte à la fois Aléatoire Accès à des endroits arbitraires dans le fichier 4/26/2019 IFT1020
Séquentiel vs. Aléatoire RandomAccessFile Pour ouvrir un fichier à accès aléatoire (ou direct) en mode de lecture et d’écriture RandomAccessFile f = new RandomAcessFile(“balounes.dat","rw"); 4/26/2019 IFT1020
Déplacements dans le fichier Pour déplacer le pointeur du fichier à un byte spécifique f.seek(n); Pour connaître la position courante du pointeur long ptr = f.getFilePointer(); Pour obtenir le nombre de bytes dans un fichier long taille = f.length(); 4/26/2019 IFT1020