La fonction la plus importante d’un ordinateur est de traiter les données. Un langage informatique utile doit avoir de bonnes capacités d'E/S afin que les données non traitées entrent dans le programme et que les données traitées en sortent.
Par rapport à d'autres langages, les fonctions IO de Java sont complexes. Dans d'autres langages, de nombreuses fonctions IO (telles que la lecture de fichiers) sont encapsulées et peuvent être implémentées avec une ou deux lignes de programme. En Java, les programmeurs ont souvent besoin de plusieurs niveaux de décoration pour réaliser la lecture des fichiers.
L’avantage de la complexité relative est la flexibilité des IO. En Java, les programmeurs peuvent contrôler l’ensemble du processus d’E/S pour concevoir la meilleure méthode d’E/S. Nous en verrons plus ci-dessous.
Exemple d'E/S
Ci-dessous se trouve le fichier file.txt que j'ai utilisé pour la démonstration
Bonjour tout le monde ! Bonjour Nerd !
Etudions d'abord un exemple de lecture de fichier :
importer java.io.*;public class Test{ public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader("file.txt")); String line = br.readLine(); while (line != null) { System.out.println(line); line = br.readLine( } br.close( } catch(IOException); e) { System.out.println("Problème IO");
Ce programme contient un gestionnaire d'exceptions try...catch...finally. Veuillez vous référer au didacticiel Java avancé sur la gestion des exceptions.
Décorateurs et combinaisons de fonctions
La clé pour programmer IO est de créer un objet BufferedReader br :
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
Lors du processus de création, nous avons d'abord créé un objet FileReader. La fonction de cet objet est de lire le flux d'octets du fichier "file.txt" et de le convertir en flux de texte. En Java, le codage de texte standard est Unicode. BufferedReader() reçoit l'objet FileReader, étend les fonctions de FileReader et crée un nouvel objet BufferedReader. En plus des fonctions de lecture et de conversion de fichiers mentionnées ci-dessus, cet objet fournit également des fonctions de lecture en cache (mise en mémoire tampon). Enfin, on peut lire le fichier ligne par ligne en appelant la méthode readLine() sur l'objet br.
(La lecture du cache consiste à ouvrir une zone de la mémoire en tant que cache, qui stocke le flux de texte lu par FileReader. Lorsque le contenu du cache est lu (comme la commande readLine()), le cache chargera le flux de texte suivant.)
BufferedReader() est un décorateur qui reçoit un objet primitif et renvoie un objet décoré avec des fonctions plus complexes. L’avantage des décorateurs est qu’ils peuvent être utilisés pour décorer différents objets. Ce que nous modifions ici, c'est le flux de texte lu à partir du fichier. D'autres flux de texte, tels que l'entrée standard, les flux de transmission réseau, etc., peuvent être modifiés par BufferedReader() pour réaliser une lecture en cache.
Le diagramme ci-dessous montre comment br fonctionne, avec les données circulant de bas en haut :
Le processus de décoration ci-dessus est très similaire à l’idée du flux de texte sous Linux. Sous Linux, nous utilisons une approche de type fonction pour traiter et transmettre les flux de texte. En Java, nous utilisons des décorateurs. Mais leurs objectifs sont similaires, à savoir réaliser la modularisation et la libre combinaison des fonctions.
plus de combinaisons
En fait, Java fournit un riche ensemble de décorateurs. FileReader combine les deux étapes de lecture et de conversion et adopte les paramètres par défaut couramment utilisés, tels que l'Unicode pour l'encodage. Nous pouvons utiliser la combinaison FileInputStream + InputStreamReader pour remplacer FileReader, séparant ainsi les deux étapes de lecture des octets et de conversion, et ayant un meilleur contrôle sur les deux processus.
(Bien sûr, FileReader est plus pratique à utiliser. InputStreamReader convertit FileInputStream en Reader pour traiter le texte Unicode)
Les flèches indiquent la direction du flux de données
La lecture et l'écriture de flux proviennent de quatre classes de base : InputStream, OutputStream, Reader et Writer. InputStream et Reader gèrent les opérations de lecture, et OutputStream et Writer gèrent les opérations d'écriture. Ils se trouvent tous deux dans le package java.io. La relation successorale est la suivante :
java.io
De plus, IOException possède les classes dérivées suivantes :
IOException
Reader et Writer et leurs classes dérivées gèrent le texte Unicode. Comme on le voit Buffered Reader, InputStreamReader ou FileReader.
InputStream et OutputStream et leurs classes dérivées gèrent les flux d'octets. Les données de l'ordinateur peuvent être considérées sous forme d'octets, de sorte qu'InputStream et OutputStream peuvent être utilisés pour traiter une plus large gamme de données. Par exemple, nous pouvons utiliser la combinaison suivante pour lire les données (telles que des entiers) contenues dans le fichier compressé :
Les flèches indiquent la direction du flux de données
Nous lisons le flux d'octets du fichier compressé, puis le décompressons et enfin lisons les données.
écrire
Les opérations d'écriture sont similaires aux opérations de lecture. Nous pouvons implémenter des fonctions d’écriture complexes en utilisant des décorations. Voici un exemple simple d’écriture de texte :
import java.io.*;public class Test{ public static void main(String[] args) { try { String content = "Merci pour votre poisson."; / crée le fichier s'il n'existe pas if (!file.exists()) { file.createNewFile(); } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(content); bw.close(); } catch(IOException e) { System.out.println("Problème IO");
L'objet fichier est créé ci-dessus pour traiter les chemins de fichiers.
Résumer
Ceci est juste une introduction de base à Java IO. Les E/S de Java sont relativement complexes. Les programmeurs Java doivent passer du temps à se familiariser avec les classes de java.io et leurs fonctionnalités.