Les entrées-sorties en Java

Les fichiers et répertoires

La manipulation des références s'effectue au travers de la classe java.io.File, et ce de façon indépendante du système de fichiers du système hôte. Le caractère de séparation utilisé dans les références est disponible par consultation du champ de classe separator ou separatorChar. Les constructeurs de la classe File sont au nombre de trois : File(String référence), File(File parent,String référence) et File(String parent,String référence). Les deux dernières constructions permettent de faire référence à un objet du système de fichiers relativement à un répértoire parent.

De nombreuses méthodes sont disponibles, entre autres :

Méthodes de la classe File
Méthode Sémantique
canRead() teste si l'application est autorisée à lire dans l'objet dénoté
canWrite() teste si l'application est autorisée à écrire dans l'objet dénoté
exists() teste si la référence existe
isDirectory() teste si l'objet est un répertoire
isFile() teste si l'objet est un fichier
isHidden() teste si l'objet est caché (commence par . sous Unix)
isAbsolute() teste si la référence est absolue
getAbsolutePath() renvoie la référence absolue de l'objet
getCanonicalPath() renvoie la référence absolue canonique de l'objet
getName() renvoie le dernier élément de la référence (basename)
getParent() renvoie la référence du répertoire parent
lastModified() renvoie la date de dernière modification
length() renvoie la longueur de l'objet
list() renvoie la liste des objets contenus dans l'objet s'il s'agit d'un répertoire.
createNewFile() créé un nouveau fichier vide s'il n'existe pas
createTempFile() créé un nouveau fichier vide temporaire
mkdir() créé un nouveau répertoire
mkdirs() créé un nouveau répertoire ainsi que les intermédiaires
delete() supprime l'objet (fichier ou répertoire)
deleteOnExit() supprimera l'objet lorsque la machine virtuelle terminera
renameTo() renomme l'objet
setLastModified() modifie la date de dernière modification de l'objet
setReadOnly() positionne la protection contre l'écriture dans l'objet

Les entrées-sorties de bas niveau

Les différentes classes que nous présentons sont dites de bas niveau car les opérations réalisées se font essentiellement sur des octets (byte). Toutes ces classes sont *Stream. On remarquera aussi que ces classes ne permettent que des entrées sorties séquentielles.

Les InputStream

Pour la lecture les classes sont toutes dérivées de la classe abstraite InputStream :

Les InputStream
Classe Utilisation
javax.sound.sampled.AudioInputStream pour lire des fichiers sons
ByteArrayInputStream pour réaliser des lectures dans un tableau de byte
FileInputStream pour réaliser des lectures depuis un fichier
FilterInputStream super classe permettant de réaliser un filtrage de la lecture
ObjectInputStream permet la désérialisation d'objets ou types primitifs
PipedInputStream permet de lire dans un tube
SequenceInputStream permet d'effectuer des lectures dans un groupe de fichiers

Un certain nombre de classes réalisent un filtrage des informations avant la délivrance à l'application :

Les FilterInputStream
Classe Utilisation
BufferedInputStream utilise un tampon de lecture
DataInputStream pour lire des types primitifs
PushbackInputStream pour permettre des lectures anticipées
java.util.zip.CheckInputStream pour effectuer des contrôles de somme
java.security.DigestInputStream pour effectuer des contrôles de signature
java.util.zip.InflaterInputStream pour effectuer des lectures dans un fichier compressé (méthode deflate)
java.util.zip.GZIPInputStream pour lire un fichier compressé au format GZIP
java.util.zip.ZipInputStream pour lire un fichier d'archive au format ZIP
javax.swing.ProgressMonitorInputStream pour suivre les lectures

La classe InputStream (abstraite) possède les méthodes suivantes :

Méthodes des InputStream
Méthode Sémantique
int available() renvoie le nombre d'octets qui pourront être llus sans conduire à un blocage
void close() ferme ce flot d'entrée et libère les resources associées
void mark(int limite) enregistre la position courante tant que limite octets ne sont pas consommés
boolean markSupported() teste si le flot supporte le marquage de position
int read() lit l'octet suivant
int read(byte[] octets) lit au plus octets.length octets en les plaçant dans le tableau
int read(byte[] o,int p,int l) lit au plus l octets en les plaçant dans le tableau à partir de p
void reset() repositionne le flot sur la dernière marque
long skip(long saut) avance dans le flot de la longueur du saut

Toutes ces méthodes (sauf mark() et markSupported()) sont susceptibles de lever une exception : IOException.

Voici un exemple d'utilisation de ces classes :

import java.io.* ;
import java.util.Vector;

public class TestFileInputStream {
  public static void main(String argv[]) {
    if (argv.length<1) {
      System.err.println("Donnez-moi quelque chose à lire");
      System.exit(1);
    }
    Vector fichiers = new Vector(argv.length);
    int i = 0;
    try {
      for (i=0; i<argv.length; i++) {
        fichiers.addElement(new FileInputStream(argv[i]));
      }
      /* Il suffit de donner une énumeration d'InputStream */
      SequenceInputStream sequence = new SequenceInputStream(fichiers.elements());
      int octet; // On lit un octet mais la fin de fichier est indiquée par -1
      while ( (octet = sequence.read()) != -1 ) { // Les fichiers sont lus intégralement et en séquence
        System.out.print( (char)octet );
      }
    } catch (FileNotFoundException e) { // Levée par le constructeur de la classe FileInputStream
      System.err.println("Fichier "+argv[i]+" non trouvé ou fermé en lecture");
      System.exit(1);
    } catch (SecurityException e) { // Levée par le constructeur de la classe FileInputStream
      System.err.println("Lecture de "+argv[i]+" rendue impossible par sécurité");
      System.exit(1);
    } catch (IOException e) { // Levée lors d'une erreur d'entrée sortie dans la méthode read()
      System.err.println("Erreur de lecture "+e.getMessage());
      System.exit(1);
    }
    System.exit(0);
  }
}

Les OutputStream

Pour l'écriture toutes les classes sont dérivées de la classe abstraite OutputStream :

Les OutputStream
Classe Utilisation
ByteArrayOutputStream pour écrire dans un tableau d'octets
FileOutputStream pour écire dans un fichier
FilterOutputStream super classe permettant de réaliser un filtrage en écriture
ObjectOutputStream permet la sérialisation d'objets et de types primitifs
PipedOutputStream pour écrire dans un tube

Un certain nombre de classes permettent de réaliser un filtrage des données avant écriture dans l'objet :

Les FIlterOutputStream
Classe Utilisation
BufferedOutputStream utilise un tampon d'écriture
DataOutputStream pour écrire des types primitifs
PrintStream pour formatter les écritures
java.util.zip.CheckedOutputStream pour effectuer des écritures avec contrôle de somme
java.util.zip.DeflaterOutputStream pour effectuer des écritures compressées (méthode deflate)
java.util.zip.GZIPOutputStream pour effectuer des écritures compressées (méthode GZIP)
java.util.zip.ZipOutputStream pour effectuer des écritures archivées (méthode ZIP)
java.security.DigestOutputStream pour effectuer des écritures signées

La classe OutputStream (abstraite) possède les méthodes suivantes :

Méthodes des OutputStream
Méthode Sémantique
void close() ferme le flot et libère les resources associées
void flush() force la sortie en vidant le buffer associé
void write(byte [] octets) écrit les octets
void write(byte [] o,int p,int l) écrit l octets à partir de la position p du tableau
void write(int octet) écrit un octet

Toutes ces fonctions sont susceptibles de lever une exception : IOException.

Les entrées-sorties de haut niveau

Ces différentes classes réalisent des entrées sorties de caractères Unicode de façon transparente pour l'application. Il est donc conseillé d'utiliser celles-ci. On remarquera aussi que ces classes n'autorise que des entrées sorties séquentielles.

Les Reader

Pour la lecture les classes sont toutes dérivées de la classe abstraite Reader :

Les Reader
Classe Utilisation
BufferedReader super classe des classes utilisant un buffer
CharArrayReader permet de lire un tableau de caractères
FilterReader super classe de filtrage en lecture
InputStreamReader pont entre un InputStream et un Reader
PipedReader permet de lire dans un tube
StringReader permet de lire dans une chaîne de caractères

La seule classe de filtrage existante est :

Les FilterReader
Classe Utilisation
PushbackReader permet de réaliser des lectures anticipées

La seule classe dérivée de BufferedReader est :

Les BufferedReader
Classe Utilisation
LineNumberReader permet de connaître le numéro de ligne courante

La seule classe dérivée de InputStreamReader est :

Les InputStreamReader
Classe Utilisation
FileReader permet de lire dans un fichier

La classe Reader (abstraite) possède les méthodes suivantes :

Méthodes des Reader
Méthode Sémantique
void close() ferme le flot et libère les resources
void mark(int limite) marque la position courante tant que limite caractères ne sont pas consommés
boolean markSupported() détermine si le flot supporte le marquage de position
int read() lit un caractère
intread(char[] cars) lit au plus cars.length caractères
int read(char[] c,int p,int l) lit au plus l caractères, les range à partir de la position p dans c
boolean ready() détermine si l'on peut lire le flot
void reset() reprend à la dernière marque
long skip(long saut) effectue un saut avant dans la lecture

Toutes ces méthodes (sauf markSupported()) sont susceptibles de lever une exception : IOException.

Les Writer

Pour les écritures les classes sont toutes dérivées de la classe abstraite Writer :

Les Writer
Classe Utilisation
BufferedWriter utilise un tampon
CharArrayWriter écrit dans un tableau de caractères
FilterWriter super classe de filtrage en écriture
OutputStreamWriter pont entre OutputStream et Writer
PipedWriter pour écrire dans un tube
PrintWriter pour formatter les écritures
StringWriter pour écrire dans une chaîne de caractères

La seule classe dérivée de OutputStreamWriter est :

Les OutputStreamWriter
Classe Utilisation
FileWriter permet d'écrire dans un fichier

La classe Writer (abstraite) possède les méthodes suivantes :

Méthodes des Writer
Méthode Sémantique
void close() ferme le flot et libère les resources associées
void flush() rend les écritures effectives
void write(char[] cars) écrit le tableau de caractères cars
void write(char[] c,int p,int l) écrit les l caractères du tableau c en commençant à la position p
void write(int c) écrit le caractère
void write(String chaîne) écrit la chaîne de caractères
void write(String chaîne,int p,int l) écrit les l caractères de la chaîne en commençant à p

Toutes ces méthodes sont susceptibles de lever l'exception IOEXception.

Les accès aléatoires

Il existe une seule classe permettant de lire ou écrire et de se déplacer dans un fichier : RandomAccessFile.

quelques méthodes de la classe RandomAccessFile
Méthode Sémantique
void close() ferme le flot et libère les resources
long length() renvoie la longueur du fichier
int read() lit un octet
boolean readBoolean() lit un booléen
double readDouble() lit un double
int readInt() lit un int
String readLine() lit une ligne de texte
int readUnsignedShort() lit un entier court non signé
String readUTF() lit une chaîne de caractères
void seek(long position) modifie la position courante
void setLength(long longueur) modifie la longueur du fichier
int skipBytes(int saut) effectue un saut en avant
void write(int o) écrit un octet
void writeBoolean(boolean b) écrit un booléen
void writeDouble(double d) écrit un double
void writeInt(int i) écrit un int
void writeUTF(String chaîne) écrit la chaîne

Valid XHTML 1.0!Valid CSS!W3C-Amaya