Les flux sont des classes permettant à un programme Java de communiquer avec l’extérieur.
Classiquement, ils peuvent être classés en deux catégories :
Il est un flux que vous conaissez depuis toujours : System
Il comporte un flux de sortie : out
, sur lequel on peut notamment effectuer des println()
Et un flux d’entrée : in
Voilà pourquoi les écritures en console s’écrivent System.out.println("…");
Quant au flux d’entrée, il peut être surveillé par un scanner : Scanner monScanner = new Scanner (System.in);
Java propose quantité de flux. La console en est un (System), mais il y a aussi les fichiers, les sockets et même la mémoire RAM.
Intellectuellement, un flux peut être vu comme un canal d’écoulement d’octets (Stream)
Avant d’aborder les flux, nous allons examiner les fichiers.
Si le flux est une notion dynamique (un écoulement), un fichier est une notion statique (un réseroir).
Le fichier, c’est la source ou la destination d’un flux (selon qu’il soit entrant ou sortant).
La classe File permet d’examiner les fichiers de l’extérieur :
Voici un exemple de manipulation de la classe File : Source
La classe file permet l’exploration récursive d’un répertoire.
Elle contient une méthode listFiles()
qui rend la liste de tous les fichiers et sous-répertoires d’un répertoire.
Maintenant, nous allons brancher un flux sur un fichier afin d’y puiser des données et les sortir sur la console.
En anglais, flux se dit stream
Reprenons notre exemple ci-dessus.
Si le fichier existe, nous allons nous y brancher et en extraire un flux de sortie que nous allons afficher sur la console.
Ce petit exemple tout simple implémente une boucle qui parcourt le fichier du début à la fin,
en extrait chaque caractère dans un flux et affiche ce flux sur la console, qui est aussi un flux.
On fait donc tout simplement une copie, octet par octet, d’un flux à l’autre.
Sur de petits fichiers, lire un octet à la fois ne pose pas de problème.
Par contre, sur de gros fichiers, demander un octet à la fois au disque dur risque de devenir très lent.
C’est pourquoi Java propose la classe BufferedInputStream, qui encadre la classe FileInputStream.
Le tampon permet d’embarquer une grande quantité d’octets d’un coup.
Cela vaut aussi pour BufferedOutputStream et FileOutputStream, en sortie.
Les classes ObjectOuputStream et ObjectInputStream permettent respectivement de sortir un objet dans un flux et de l’y récupérer, sous forme d’une séquence d’octets.
Ainsi, on peut sauver un objet dans un fichier, ou l’envoyer d’un PC à l’autre par un socket.
Pour ce faire, l’objet doit implémenter l’interface Serializable, qui est une interface de balisage, sans méthode à implémenter.
Voici l’objet Personne que nous allons sauver et relire dans un flux