ENPC - Objets et Patterns - Séance 10

Les flots

Lors de l'exécution d'un programme toute communication avec les différents périphériques de la machine (écran, clavier, stockage, réseau) se fait par ce que l'on appelle un flot de données. On nomme également flot, ou stream, l'abstraction d'une telle suite d'informations transitant d'un point à un autre. Lorsqu'il s'agit d'un flot d'information entrant dans le programme, on parle de flot d'entrée ou flot en lecture (input); lorsqu'il s'agit d'un flot d'information sortant du programme, on parle de flot de sortie ou en écriture (output). Toutes les fonctionnalités relatives aux entrées/sorties (ou input/output) disponibles en Java sont regroupées dans le package java.io.

En fait, dès le premier programme que vous avez écrit, vous avez utilisé un flot: System.out, qui représente le flot en écriture (ou flot de sortie) standard du système, est l'accès permettant d'envoyer une suite d'information vers le périphérique "écran". Le type de ce flot est PrintStream.

En dehors du fait qu'ils soient de lecture ou d'écriture, on peut distinguer deux grandes catégories de flots:

Fichiers

Les flots sur les fichiers sont FileInputStream et FileOutputStream pour les fots d'octets, FileReader et FileWriter pour les flots de caractères et enfin RandomAccessFile pour les fichiers pouvant être accédés à la fois en lecture et en écriture.

Exercice 1: écrire une méthode ecrire(String fileName, String[] t) qui écrit dans le fichier de nom fileName toutes les chaînes de caractères du tableau t. Comment faire pour pouvoir les lire ensuite et les identifier individuellement? Écrire une telle méthode lire(String fileName) permettant de relire le fichier de nom fileName et retournant les chaînes lues dans un tableau de String. Tester ces deux méthodes dans un programme qui écrit puis relit les chaînes de caractères passées sur la ligne de commande.

Entrée / sortie standard

Vous êtes maintenant en mesure de lire le flot d'entrée standard, System.in, qui est un InputStream.

Exercice 2: écrire un petit programme qui affiche sur le flot de sortie standard toutes les lignes de caractères entrées sur le flot d'entrée standard après les avoir mises en majuscule. Ce programme se terminera lorsqu'un point seul (".") sera donné en entrée.

Flots d'objets

Plutôt que d'écrire ou de lire octet par octet, ou bien caractère par caractère, afin de pouvoir faire transiter des données, les flots d'objets permettent d'écrire ou de lire directement un objet dans un flot. Ce mécanisme est appelé sérialisation et est un format qui est propre à Java. Les flots de base qui supportent ces fonctionnalités sont ObjectOutputStream et ObjectInputStream.

La sérialisation d'un objet obj se fait par un simple appel à la méthode writeObject(). De même, la désérialisation d'un objet est effectuée par un appel à la méthode readObject() qui retourne l'objet lu. Les objets ainsi sérialisés doivent être d'une classe qui implémente l'interface Serializable, sinon une exception de type NotSerializableException est levée.

Exercice 3: reprendre l'exercice 1 en utilisant des flots d'objets.

Exercice 4: même chose, mais pour écrire et relire une liste (LinkedList, par exemple) d'instances de la classe Point que vous avez développée il y a quelques semaines.

Exercice

Programmez les exercices de cette feuille et envoyez-les moi par mail à Etienne.Duris[at]univ-mlv.fr.


Etienne.Duris[at]univ-mlv.fr - © École Nationale des Ponts et Chaussées - Janvier 2001 - http://www-igm.univ-mlv.fr/~duris/ENPC/index2000.html