Par entrées-sorties on entend au sens large la façon dont un programme lit et écrit des données, et au sens particulier l’interaction entre le programme et le système de fichiers de la machine.
Un fichier est un ensemble de données qui survit à la fin de l’exécution des
programmes, et même, la plupart du temps, à l’arrêt de l’ordinateur.
Les fichiers se trouvent le plus souvent sur le disque de la
machine, mais ils peuvent aussi se trouver sur une disquette, ou sur
le disque d’une autre machine et être accédés à travers le réseau. Un
système d’exploitation tel qu’Unix, offre une abstraction des
fichiers, généralement sous forme de flux (stream).
Dans sa forme la plus simple le flux offre un accès séquentiel : on
peut lire le prochain élément d’un flux (ce qui le consomme) ou écrire
un élément dans un flux (généralement à la fin).
Dans la majorité des cas (et surtout en Unix), les fichiers
contiennent du texte, il est alors logique, vu de Java,
de les considérer comme des flux de char
.
Par fichier texte, nous entendons d’abord fichier qu’un humain
peut écrire, lire et comprendre, par exemple un source Java.
Les fichiers qui ne s’interprètent pas ainsi sont dits binaires,
par exemple une image ou un fichier de bytecode Java.
Il est logique, vu de Java, de considérer les fichiers binaires comme
des flux de byte
. Par la suite nous ne considérons que les
fichiers texte.
Quand vous lancez un programme dans une fenêtre de commandes (shell), il peut lire ce que vous tapez au clavier (flux d’entrée standard) et écrire dans la fenêtre (flux de sortie standard). Le shell permet de rediriger les flux standard vers des fichiers (par <fichier et >fichier), ce qui permet de lire et d’écrire des fichiers simplement. Enfin il existe un troisième flux standard, la sortie d’erreur standard normalement connectée à la fenêtre comme la sortie standard. Même si cela ne semble pas utile, il faut écrire les messages de diagnostic et d’erreur dedans, et nous allons voir pourquoi.