Sans la possibilité de lire ou d'écrire des informations, un programme va se trouver vite limité
Comment prendre l'information en entrée à partir de n'importe quelle source ?
Comment envoyer en sortie de l'information vers n'importe quelle destination ?
Source et destination : fichier, socket réseau, bloc mémoire
Nature des données échangées : texte (caractère, nombre, chaîne de caractères), des images, du son, ...
Les flux permettent de travailler avec des données provenant de l'extérieur
Toutes les commandes de type Ouvrir, Enregistrer, ... des programmes classiques font appel aux flux
On parle aussi d'Input/Output
Dans ce cours nous allons nous limiter aux flux de base permettant de lire et d'écrire du texte
La mise en mémoire du contenu d'un flux peut accélérer ses performances
En java, on parle de :
flux d'entrée
objet à partir duquel on lit une suite d'octets (byte)
flux de sortie
objet vers lequel on envoie une suite d'octets
Les flux sont définis à l'aide d'objets prédéfinis du langage Java (package java.io)
Il existe ainsi plusieurs outils permettant :
le stockage
le traitement des données
Dorénavant, dans toutes les classes qui feront usage de flux d'entrée/sortie, il faudra ajouter en début de classe l'instruction suivante :
import java.io.* ;
Il y a deux grandes catégories :
les fichiers stockant les informations sous forme de caractères (= fichiers texte)
les fichiers stockant les informations sous forme d'objet (=fichier des objets )
Comme flux basique, vous avez déjà utilisé
System.out pour les sorties
System.in pour les entrées
il existe également System.err pour les erreurs
Les classes suivantes implémentent deux types de flux d'octets, à savoir :
InputStream
et
OutputStream
Or en Java les caractères sont codés en Unicode. Comme les flux d'octets ne conviennent pas pour le traitement des informations codées en Unicode (codage sur deux octets), il a été introduit une hiérarchie de classes pour traiter les caractères Unicode
Les deux classes qui vont permettre de traiter les caractères Unicode sont les suivantes :
Reader
et
Writer
A partir de ces quatre classes, Java fait dériver une multitude de classes
Exemples :
BufferedInputStream et FileInputStream dérivent de InputStream
BufferedOutputStream, FileOutputStream dérivent de OutputStream
BufferedReader, FileReader dérivent de la classe Reader
BufferedWriter, FileWriter dérivent de la classe Writer
Comment sont constitués ces noms de classes de flux du paquetage java.io ?
Ces mots composés permettent de savoir:
l'origine ou la destination du flux : tampon, fichier, tableau, tube
le sens de l'échange : Input, Output, Reader, Writer
s'il est question d'octets ou de caractères :
Stream pour les octets,
Reader ou Writer pour les caractères
ils fournissent les flux d'entrée et de sortie associés à un disque dur
Il faut donc fournir le nom du fichier ou le chemin complet du fichier dans le constructeur
L'instruction suivante est un exemple de déclaration d'un flux d'entrée associer au fichier qui porte le nom somefile.txt et qui se trouve sur le volume E du disque et dans le dossier data.
FileInputStream fin = new FileInputStream ("E/data/somefile.txt");
Si le chemin du fichier n'est pas absolu, Java suppose que le fichier se trouve dans le répertoire courant où se trouve votre programme en cours d'exécution et va donc chercher un fichier portant le nom somefile.txt
Par exemple si vous indiquez simpelemnt ("somefile.txt") cela suppose que le fichier est dans le répertoire courant.