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é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 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.
Pour la lecture les classes sont toutes dérivées de la classe abstraite 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 :
| 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é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);
}
}
Pour l'écriture toutes les classes sont dérivées de la classe abstraite 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 :
| 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é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.
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.
Pour la lecture les classes sont toutes dérivées de la classe abstraite 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 :
| Classe | Utilisation |
|---|---|
| PushbackReader | permet de réaliser des lectures anticipées |
La seule classe dérivée de BufferedReader est :
| Classe | Utilisation |
|---|---|
| LineNumberReader | permet de connaître le numéro de ligne courante |
La seule classe dérivée de InputStreamReader est :
| Classe | Utilisation |
|---|---|
| FileReader | permet de lire dans un fichier |
La classe Reader (abstraite) possède les méthodes suivantes :
| 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.
Pour les écritures les classes sont toutes dérivées de la classe abstraite 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 :
| Classe | Utilisation |
|---|---|
| FileWriter | permet d'écrire dans un fichier |
La classe Writer (abstraite) possède les méthodes suivantes :
| 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.
Il existe une seule classe permettant de lire ou écrire et de se déplacer dans un fichier : 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 |