Les flux d'entrée-sortie (I/O streams) sont l'un des concepts fondamentaux de Java, apparus depuis les premières versions du langage. Ce concept a été initialement développé dans le but d'abstraire les processus de lecture et d'écriture des données : un flux peut être lié à un fichier, un réseau ou même à la console - pour le code, cela semble identique.
Problème se pose lorsque le développeur gère mal les flux, oublie de les fermer ou confond différents types de flux (caractères et octets), ce qui conduit souvent à des fuites de ressources, une distorsion des données ou des erreurs à l'exécution.
Solution : compréhension et application correctes de la hiérarchie des flux d'entrée-sortie (InputStream/OutputStream pour les octets, Reader/Writer pour les caractères), ainsi que la fermeture obligatoire des flux après leur utilisation, de préférence via try-with-resources depuis Java 7.
Exemple de code pour lire et écrire un fichier :
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt")); BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { String line; while ((line = reader.readLine()) != null) { writer.write(line); writer.newLine(); } }
Caractéristiques clés :
Que se passe-t-il si l'on ne ferme pas un flux d'entrée-sortie en Java ?
Les flux manipulent des ressources système de bas niveau, et ne pas fermer un flux peut entraîner des fuites de mémoire, le blocage de fichiers, des défaillances dans le fonctionnement de l'application ou même l'épuisement des descripteurs de fichiers au niveau du système d'exploitation.
Peut-on utiliser le même OutputStream pour écrire dans différents fichiers ?
Non, la classe OutputStream est strictement associée à une seule source/destination de données. Pour différents fichiers - différents objets OutputStream.
Quelle est la différence entre PrintWriter et BufferedWriter ? Quand utiliser chacun ?
PrintWriter est spécialisé dans l'ajout de méthodes de sortie formatée, par exemple println(), et peut travailler avec le déversement automatique. BufferedWriter, en revanche, améliore principalement les performances grâce à la mise en tampon. Pour la plupart des tâches applicatives, PrintWriter est préférable pour la sortie textuelle, mais si vous avez simplement besoin d'écrire rapidement des caractères ou des chaînes sans formatage - BufferedWriter conviendra mieux.
Un développeur lit des données à partir d'un grand fichier en utilisant FileInputStream, ne utilise pas de mise en tampon et oublie de fermer le flux.
Avantages :
Inconvénients :
Une combinaison BufferedReader avec try-with-resources est utilisée, la lecture et le traitement se font par lots de lignes, le flux se ferme automatiquement.
Avantages :
Inconvénients :