Previous Up Next

B.5.2  Un peu plus que le minimum : lire des fichiers

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.

  Reader in = new FileReader (name) ;

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).

import java.io.* ;

class Cat2 {
  static void cat(Reader in) throws IOException {
    for ( ; ; ) {
      int c = in.read ();
      if (c == -1) break;
      System.out.print ((char)c);
    }
  }

  public static void main(String [] arg) {
    if (arg.length == 0) {
      try {
        cat(new InputStreamReader(System.in)) ;
      } catch (IOException e) {
        System.err.println("Malaise : " + e.getMessage()) ;
        System.exit(2) ;
      }
    } else {
      for (int k = 0 ; k < arg.length ; k++) {
        try {
          Reader in = new FileReader(arg[k]) ;
          cat(in) ;
          in.close() ;
        } catch (IOException e) {
          System.err.println("Malaise : " + e.getMessage()) ;
        }
      }
    }
  }
}

Remarquons :


Previous Up Next