Maîtriser les E/S Java : Fichiers, Flux et Fondamentaux Input/Output
Le package java.io contient quasiment toutes les classes nécessaires pour effectuer des entrées/sorties (E/S) en Java. Tous ces flux représentent une source d'entrée et une destination de sortie. Les flux supportent divers types de données : primitives, objets, caractères localisés, etc.
Les Flux (Streams)
Un flux est une séquence de données. Deux catégories principales :
- InputStream : lecture de données depuis une source
- OutputStream : écriture de données vers une destination
Flux d'octets (Byte Streams)
Pour l'E/S de données binaires (8 bits). Classes principales : FileInputStream et FileOutputStream.
Exemple : copier un fichier
import java.io.*;
public class CopierFichier {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("entree.txt");
out = new FileOutputStream("sortie.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) in.close();
if (out != null) out.close();
}
}
}
Flux de caractères (Character Streams)
Pour l'E/S de caractères Unicode 16 bits. Classes principales : FileReader et FileWriter. Internement, FileReader utilise FileInputStream et lit deux octets à la fois.
Exemple : copier un fichier avec caractères Unicode
import java.io.*;
public class CopierFichier {
public static void main(String args[]) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("entree.txt");
out = new FileWriter("sortie.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) in.close();
if (out != null) out.close();
}
}
}
Flux standards
Trois flux standards, similaires à STDIN/STDOUT/STDERR en C/C++ :
- System.in : entrée standard (clavier)
- System.out : sortie standard (écran)
- System.err : erreur standard (écran)
Exemple : lecture console jusqu'à 'q'
import java.io.*;
public class LireConsole {
public static void main(String args[]) throws IOException {
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println("Entrez des caractères, 'q' pour quitter.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while (c != 'q');
} finally {
if (cin != null) cin.close();
}
}
}
Lecture et écriture de fichiers
Deux flux importants : FileInputStream et FileOutputStream.
FileInputStream
Constructeurs principaux :
// Par nom de fichier
InputStream f = new FileInputStream("C:/java/hello");
// Par objet File
File fichier = new File("C:/java/hello");
InputStream f = new FileInputStream(fichier);
Méthodes utiles :
| Méthode | Description |
|---|---|
close() | Ferme le flux, libère les ressources |
read() | Lit un octet, retourne -1 si fin de fichier |
read(byte[] b) | Lit b.length octets dans un tableau |
available() | Nombre d'octets lisibles sans bloquer |
FileOutputStream
Crée le fichier s'il n'existe pas. Constructeurs :
// Par nom de fichier
OutputStream f = new FileOutputStream("C:/java/hello");
// Par objet File
File fichier = new File("C:/java/hello");
OutputStream f = new FileOutputStream(fichier);
Méthodes utiles :
| Méthode | Description |
|---|---|
close() | Ferme le flux |
write(int b) | Écrit un octet |
write(byte[] b) | Écrit un tableau d'octets |
Exemple combiné
import java.io.*;
public class TestFluxFichier {
public static void main(String args[]) {
try {
byte bWrite[] = {11, 21, 3, 40, 5};
OutputStream os = new FileOutputStream("test.txt");
for (int x = 0; x < bWrite.length; x++) {
os.write(bWrite[x]);
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();
for (int i = 0; i < size; i++) {
System.out.print((char) is.read() + " ");
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
}
}
Navigation de fichiers et E/S
Classes principales : File, FileReader, FileWriter.
Répertoires en Java
Un répertoire est un File contenant une liste de fichiers et répertoires.
Créer des répertoires
mkdir(): crée un répertoire, retourne true/falsemkdirs(): crée le répertoire et tous ses parents
Exemple
import java.io.File;
public class CreerRepertoire {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
d.mkdirs(); // crée toute l'arborescence
}
}
Java gère automatiquement les séparateurs de chemin (/ sur Windows aussi).
Lister un répertoire
import java.io.File;
public class LireRepertoire {
public static void main(String[] args) {
File file = new File("/tmp");
String[] paths = file.list();
if (paths != null) {
for (String path : paths) {
System.out.println(path);
}
}
}
}
Résultat exemple :
test1.txt
test2.txt
LireRepertoire.java
LireRepertoire.class
Java
- Maîtriser l'entrée/sortie en C : scanf() et printf() expliqués
- Entrées/sorties de fichiers Python : maîtriser les opérations sur les fichiers
- Variables et littéraux en Java : Guide complet
- Maîtriser l'entrée/sortie Java : Afficher, lire et formater vos données
- Classes et objets en Java : Guide pratique
- Classes et méthodes abstraites en Java : guide complet
- Maîtriser les classes imbriquées et internes en Java : types, exemples et bonnes pratiques
- Java throw vs throws : maîtriser la gestion d'exceptions avec exemples pratiques
- Maîtriser Java Scanner : Guide complet avec exemples pratiques