Filtre sur flux de données

 

 

Après avoir vu comment gérer de manières très basique des flux de données, nous allons améliorer le traitement de ces données.

En effet, il y a de forte chance que vous ayez besoin de traiter une ligne complète d'un flux de type caractère, plutôt que de traiter un caractère à la fois pour obtenir le contenu de cette même ligne !

Et il y a encore d'autres exemples du même style !

Ces traitements sont proposés dans une seconde catégorie de classes: Les filtres sur flux de données provenant du paquetage java.io.

 

Le principe de nommage des filtres est identique à celui utilisé pour nommé les flux de données:

Tout d'abord, il faut distinguer les classes de flux sur caractères et les classes de flux binaires. Et pour ces flux, si vous voulez faire une lecture ou une écriture.

Nous avons donc:

Les classes de flux de type caractères dérivant de:

  • java.io.Reader pour la lecture
  • java.io.Writer pour l'écriture

Image non trouvée !Les classes java.io.Reader et java.io.Writer étant des classes abstraires.

Les noms de ces classes se termineront ainsi par Reader ou Writer suivant le cas pour lire ou écrire des caractères.

Les classes de flux de type binaires dérivant de:

  • java.io.InputStream pour la lecture
  • java.io.OutputStream pour l'écriture

Image non trouvée !Les classes java.io.InputStream et java.io.OutputStream étant elles aussi des classes abstraires.

Les noms de ces classes se termineront cette fois-ci par InputStream ou OutputStream suivant le cas.

Ce qu'il reste à définir, c'est le filtre que l'on veut appliquer et là encore, il suffira de préfixer:

Pour InputStream

-> ObjectInputStream (sérialisation)

-> FilterInputStream

-> BufferedInputStream (gestion d'un tampon en mémoire)

-> DataInputStream (gestion des données binaires d'un type primitif autre que byte)

-> PushbackInputStream (gestion des retours en arrière pendant la lecture d'un flux)

Pour OutputStream

-> ObjectOutputStream (sérialisation)

-> FilterOutputStream

-> BufferedOutputStream (gestion d'un tampon en mémoire)

-> DataOutputStream (gestion des données binaires d'un type primitif autre que byte)

-> PrintStream (gestion des flux de données au format texte)

Pour Reader

-> InputStreamReader (gestion de l'encode des caractères des flux de données binaires)

-> FilterReader

-> PushbackReader (gestion des retours en arrière pendant la lecture d'un flux)

-> BufferedReader

-> LineNumberReader

Pour Writer

-> OutputStreamWriter

-> FilterWriter

-> BufferedWriter

-> PrintWriter

 

 

Image non trouvée !Le préfixe: Object que l'on applique à InputStream ou OutputStream sera étudié dans le chapitre sérialisation des objets...

Il s'agit en fait de charger ou de sauver l'instance d'un objet en mémoire (sérialisation).

Image non trouvée !D'autres préfixes: Zip, GZIP et Jar dans le paquetage java.util.zip et java.util.jar...

 

Fermeture d'un filtre

Tout comme les flux, tous filtres ouverts devront être fermés. Nous utiliserons pour cela la méthode close.

Désignation Classe java.io.Reader Classe java.io.InputStream Remarque
Fermeture du flux de données public void close() public void close() A mettre dans tous les cas pour terminer avec le flux.Indispensable lors d'une maj sinon, le fichier sera vide !

Image non trouvée !On préfèrera utiliser la méthode close() dans un bloc finally, permettant ainsi une fermeture propre du flux, qu'il y ait eu ou non une exception. Dans le même principe, la déclaration de la variable permettant d'identifier le flux (monFluxFichier dans mon exemple) sera à déclarer hors du bloc try et cette variable sera positionnée à null. Cela permet de tester celle-ci avant de faire un close(). Si la variable est toujours à null lors du finally, c'est que le flux n'a pas été ouvert, donc rien à faire (voir exemples ci-dessus) !

 

Principales méthodes des classes de filtres

 

Exemple de code simple

Dans le code suivant, nous allons récupérer toutes les lignes pour les comptabiliser et les afficher. Nous afficherons aussi la taille du fichier.

 

 

Cumuler les filtres

Nous avons vu que jusqu'à présent, nous nous contentions de pluger un filtre sur un flux. Mais il sera possible de faire de même avec des filtres:

filtre 2 + filtre 1 + flux

Par exemple:

Appliquer un filtre DataOutputStream sur BufferedOutputStream sur un flux OutputStream.

Pb.: le type n'étant pas le même entre DataOutputStram et BufferedOutputStream, JAVA ne va pas aimer. Qu'à cela ne tienne, il existe un type qui est commun aux deux, il suffira donc d'utiliser: le type OutputStream.