 |
4. FLUX D'ENTREE ET 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.
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.
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.
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.
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);
}
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). |
|
|