4. FLUX D'ENTREE ET DE SORTIE
 
 
FLUX DE SORTIE
 

Le schéma suivant représente la hiérarchie des flux de sortie (fichiers en mode écriture, écran) considérés dans ce chapitre. Ils héritent tous de la classe OutputStream du package java.io.

 
 
Mode texte
 

Le flux écran, l'objet System.out, appartient à la classe PrintStream qui représente un flux texte. Il est possible de construire un objet de cette classe à partir d'un fichier de sortie de la classe FileOutputStream.

FileOutputStream fichier = new FileOutputStream("sortie.txt");
PrintStream flux = new PrintStream(fichier);

Ainsi, les fichiers de sortie et l'écran appartiennent à la même classe qui dispose des méthodes print et println. Celles-ci permettent d'écrire en mode texte un objet (ou un élément de type primitif) dans le flux. La particularité de la méthode println est de retourner à la ligne après avoir écrit l'objet.

String s = new String("Hello !");
Date d = new Date();
int i = 5;

flux.println(s);
flux.println(d);
flux.println(i);
fichier.close();

Lorsqu'un objet est passé en paramètre à print ou println (e.g. l'objet d), sa méthode toString héritée de la classe Object est appelée et retourne une forme texte de l'objet. Il faut penser à fermer un flux de fichier, quel qu'il soit, dès qu'il n'est plus utile, à l'aide de la méthode close.

 
Mode binaire
 

Un objet de la classe FileOutputStream peut être manipulé en mode binaire. Pour cela, il faut construire un objet de la classe DataOutputStream qui permet d'écrire le contenu d'éléments primitifs dans le flux, grâce aux méthodes writeBoolean, writeByte, writeChar, writeDouble, writeFloat, writeInt, writeLong, writeShort... L'exemple suivant écrit un flottant et une chaîne de caractères en binaire dans un fichier.

FileOutputStream fichier = new FileOutputStream("sortie.dat");
DataOutputStream flux = new DataOutputStream(fichier);
double d = 3.5;

flux.writeDouble(d);
flux.writeChars("hello !");

La méthode writeChars permet d'écrire en binaire tous les caractères d'une chaîne.

 
FLUX D'ENTREE
 

Le schéma suivant représente la hiérarchie des flux d'entrée (fichiers en mode lecture, clavier) considérés dans ce chapitre. Ils héritent tous de la classe InputStream du package java.io.

 
 
Mode texte
 

Le flux clavier, l'objet System.in, appartient directement à la classe InputStream, alors qu'un fichier d'entrée est un objet de la classe FileInputStream, héritant de InputStream. A partir de cette super-classe, il est possible de construire un flux InputStreamReader qui représente un flux d'entrée texte pouvant être manipulé caractère par caractère. De cet objet, il est nécessaire de construire un flux d'entrée texte de la classe StreamTokenizer si l'on désire extraire directement les items (entiers, flottants, mots...), le séparateur entre ces éléments étant le caractère espace par défaut.

FileInputStream fichier = new FileInputStream("entree.txt");
InputStreamReader lecteur = new InputStreamReader(fichier);
// ou lecteur = new InputStreamReader(System.in);
StreamTokenizer flux = new StreamTokenizer(lecteur);

Ainsi, les fichiers d'entrée et le clavier appartiennent à la même classe qui dispose de méthodes permettant de lire dans un flux texte un mot (i.e. une chaîne de caractères sans espace, grâce à la méthode sval) ou un flottant double précision (grâce à la méthode nval). L'exemple suivant lit un flottant puis un mot dans le flux.

double d;
String s;

if (flux.nextToken()==StreamTokenizer.TT_NUMBER)
 d=flux.nval;

if (flux.nextToken()==StreamTokenizer.TT_WORD)
 s=flux.sval;

La méthode nextToken avance d'un item chaque fois qu'elle est exécutée. Il est impératif de l'appeler avant nval ou sval la première fois, afin de placer le flux sur le premier item. La méthode nextToken retourne un entier qui indique sur quoi pointe le flux. Des constantes symboliques, de la classe StreamTokenizer, permettent d'analyser ce retour. TT_WORD signifie que le flux pointe sur un mot, TT_NUMBER sur un nombre, TT_EOF que la fin de fichier est atteinte... L'exemple suivant lit un fichier rempli d'entiers.

int i;

while (flux.nextToken()!=StreamTokenizer.TT_EOF) {
 i=(int)flux.nval;
 System.out.println(i);
}

 
Mode binaire
 

Un objet de la classe FileInputStream peut être manipulé en mode binaire. Pour cela, il faut construire un objet de la classe DataInputStream qui permet de lire des éléments de type primitif dans le flux, grâce aux méthodes readBoolean, readByte, readChar, readDouble, readFloat, readInt, readLong, readShort... L'exemple suivant lit les flottants contenus dans un fichier binaire et les affiche à l'écran.

FileInputStream fichier = new FileInputStream("entree.dat");
DataInputStream flux = new DataInputStream(fichier);
double d;

while (flux.available()!=0) {
 d=flux.readDouble();
 System.out.println(d);
}

La méthode available permet de détecter la fin d'un flux binaire puisqu'elle renvoie le nombre d'octets encore disponibles dans ce flux.

 
 
Copyright (c) 1999-2016 - Bruno Bachelet - bruno@nawouak.net - http://www.nawouak.net
La permission est accordée de copier, distribuer et/ou modifier ce document sous les termes de la licence GNU Free Documentation License, Version 1.1 ou toute version ultérieure publiée par la fondation Free Software Foundation. Voir cette licence pour plus de détails (http://www.gnu.org).