La commande cat de Unix est plus puissante que
notre Cat
. Si on donne des arguments sur la ligne de commande,
ils sont interprétés comme des noms de fichiers. Le contenu
des fichiers est alors affiché sur la sortie standard, un fichier
après l’autre.
La commande cat permet donc de concaténer des fichiers.
Par exemple
% cat a a > b
range deux copies mises bout-à-bout du contenu
du fichier a dans le fichier b.
Comme souvent, si on ne donne pas d’argument à la commande cat, alors
c’est l’entrée standard qui est lue. Ainsi cat < a > b
copie toujours
le fichier a dans le fichier b.
Pour lire un fichier à partir de son nom, on construit une nouvelle sorte
de Reader
: un FileReader. Cela revient à ouvrir un
fichier en lecture, c’est-à-dire à demander au système d’exploitation
de mobiliser les ressources nécessaires pour cette lecture.
Si name
est un nom de fichier, on procède ainsi.
Si le fichier de nom name
n’existe pas, une
exception est lancée (FileNotFoundException sous-classe de
IOException).
Il est de bon ton de fermer les fichiers que l’on
a ouvert, afin de rendre les ressources mobilisées lors de
l’ouverture. En effet un programme donné ne peut pas posséder plus
qu’un nombre fixé de fichiers ouvert en lecture.
On ferme un Reader
en appelant sa méthode close()
.
Il faut noter qu’une tentative de lecture dans
une entrée fermée échoue et se solde par le lancement d’une exception
spécifique.
Voici la nouvelle classe Cat2
(source Cat2.java).
Remarquons :
cat
, car cette lecture s’opère dans deux contextes
différents. On note aussi l’intérêt du sous-typage : l’argument
Reader in
est ici un objet InputStreamReader
ou
FileReader
, mais comme il n’est pas utile de le savoir dans la
méthode cat
, on en profite pour partager du code.for (int k = 0 ;
…, et sa clause catch
ne contient pas d’appel à System.exit
.
Il en résulte que le programme n’échoue pas en cas
d’erreur de lecture d’un fichier donné par son nom — ou même de fichier
inexistant, car FileNotFoundException
est une sous-classe de
IOException
. Au lieu d’échouer, on passe au fichier suivant.% java Cat2 a x a > b Malaise : x (No such file or directory)Un message d’erreur est affiché dans la fenêtre, et b contient deux copies de a.