Les flux et les fichiers

Les flux et les fichiers

Au cours des précédents chapitres, nous avons affiché des informations dans la fenêtre con- sole en utilisant la méthode System.out.println. En fait, out est ce que l’on nomme un « flux de sortie ». En Java (comme en C++), la notion de flux est très générale puisqu’un flux de sortie désigne n’importe quel « canal » susceptible de recevoir de l’information sous forme d’une suite d’octets. Il peut s’agir d’un périphérique d’affichage, comme c’était le cas pour out, mais il peut également s’agir d’un fichier ou encore d’une connexion à un site distant, voire d’un emplacement en mémoire centrale.De façon comparable, il existe des flux d’entrée, c’est-à-dire des canaux délivrant de l’infor- mation sous forme d’une suite d’octets. Là encore, il peut s’agir d’un périphérique de saisie (clavier), d’un fichier, d’une connexion ou d’un emplacement en mémoire centrale.Comme dans la plupart des langages, Java distingue les flux binaires des flux texte. Dans le premier cas, l’information est transmise sans modification de la mémoire au flux ou du flux à la mémoire. Dans le second cas, en revanche, l’information subit une transformation, nom- mée formatage, de manière que le flux reçoive ou transmette, en définitive, une suite de caractères. Nous avons déjà vu que la méthode println réalise un tel formatage.

Dans la plupart des langages, on peut accéder à un fichier binaire, soit de façon séquentielle, soit de façon directe. Dans le premier cas, on traite les informations (octets) séquentiel- lement, c’est-à-dire dans l’ordre où elles apparaissent (apparaîtront) dans le fichier. Dans le second cas, on se place directement sur l’information voulue, sans avoir ainsi à consulter ou créer celles qui précèdent. Ces possibilités se retrouvent en Java qui propose des flux binaires permettant soit l’accès séquentiel, soit l’accès direct. Notez que, en Java, un fichier créé à l’aide d’un flux à accès direct pourra très bien être exploité ultérieurement à l’aide d’un flux. La réciproque est également vraie. Nous verrons d’ailleurs que certaines métho- des de lecture et d’écriture sont communes aux deux types de flux : dans le cas de l’accès direct, on se contentera simplement de recourir à une méthode supplémentaire agissant sur un pointeur de fichier.Cette opération associe l’objet f à un fichier de nom entiers.dat. Si ce fichier n’existe pas, il est alors créé (vide). S’il existe déjà, son ancien contenu est détruit. On a donc affaire à une classique opération d’ouverture d’un fichier en écriture.La classe DataOutputStream dispose notamment de méthodes permettant d’envoyer sur un flux (donc ici d’écrire dans un fichier) une valeur d’un type primitif quelconque. Elles se nomment writeInt (pour int), writeFloat (pour float), et ainsi de suite. Ici, writeInt nous con- viendra.

Exemple de programme

Voici donc un programme complet qui lit des nombres entiers au clavier et qui les recopie dans un fichier binaire. Ici, par souci de simplicité, nous avons convenu que l’utilisateur four- nirait un entier nul à la suite de sa dernière valeur (il n’est pas recopié dans le fichier).D’autre part, on relève la présence de la clause throws IOException dans l’en-tête main. En effet, la méthode writeInt (comme toutes les méthodes d’écriture de DataOutputStrream) peut déclencher une exception (explicite) du type IOException en cas d’erreur d’écriture. Dans ces conditions, comme nous l’avons vu au , celle-ci doit être soit traitée, soit déclarée dans throws.2 Il est possible de doter un flux d’un tampon. Il s’agit d’un emplacement mémoire qui sert à optimiser les échanges avec le flux. Les informations sont d’abord enregistrées dans le tampon, et ce n’est que lorsque ce dernier est plein qu’il est « vidé » dans le flux. Pour doter un flux de type FileOutputStream d’un tampon, on crée un objet de type Buf- feredOutputStream en passant le premier en argument de son constructeur. Voici com- ment nous pourrions modifier dans ce sens l’initialisation de la variable sortie du programme précédent :Lorsqu’un flux est doté d’un tampon, sa fermeture (close) vide tout naturellement le tampon dans le flux. On peut aussi provoquer ce vidage à tout moment en recourant à la méthode flush.Comme on peut s’y attendre, par analogie avec ce qui précède, la classe abstraite InputStream sert de base à toute classe relative à des flux binaires d’entrée. La classe FileInputStream, dérivée de InputStream, permet de manipuler un flux binaire associé à un fichier en lecture. L’un de ses constructeurs s’utilise ainsi :Voyons maintenant comment relire séquentiellement un fichier tel que celui créé par le pro- gramme du paragraphe 1, afin d’en afficher le contenu à l’écran.

 

Cours gratuitTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *