Java BufferedReader : Comment lire un fichier avec un exemple
⚡ Résumé intelligent
Java BufferedReader lit le texte à partir d'un flux d'entrée en mettant en mémoire tampon les caractères, ce qui rend la lecture de fichiers ligne par ligne rapide et simple.ping un lecteur de fichiers à l'intérieur BufferedReader et looping La fonction readLine imprime l'intégralité du fichier jusqu'à ce qu'elle renvoie null.

Comment lire un fichier dans Java?
Java offre plusieurs mécanismes pour lire à partir d'un fichier. Le paquet le plus utile pour cela est java.io, dont les abdostract Reader La classe définit la lecture en flux de caractères. java.io.BufferedReader est la sous-classe concrète utilisée pour une lecture efficace ligne par ligne.
Qu'est-ce que le BufferedReader dans Java?
BufferedReader est une Java Classe permettant de lire du texte à partir d'un flux d'entrée, tel qu'un fichier, en mettant en mémoire tampon les caractères afin d'optimiser la lecture des caractères, des tableaux et des lignes. Sans mise en mémoire tampon, chaque requête de lecture effectuée par un lecteur déclenche une requête de lecture correspondante sur le flux de caractères ou d'octets sous-jacent.
Il est donc conseillé d'envelopper BufferedReader autour de tout lecteur dont read() Les opérations peuvent être coûteuses, comme par exemple FileReader et InputStreamReaderUne utilisation typique consiste à transmettre le chemin d'accès au fichier au lecteur comme suit :
// Note the doubled backslash: a single \ starts an escape sequence objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));
Cela charge le fichier dans objReaderVous parcourez ensuite le contenu du fichier et affichez chaque ligne. La boucle `while` du code ci-dessous lit le fichier jusqu'à la fin.
while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); }
strCurrentLine maintient la ligne actuelle, et objReader.readLine() Renvoie une chaîne de caractères. La boucle continue donc à s'exécuter tant que la valeur renvoyée n'est pas nulle, et s'arrête à la première valeur nulle, qui signale la fin du fichier.
BufferExemple edReader
Le code ci-dessous est complet Java BufferExemple d'edReader :
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { BufferedReader objReader = null; try { String strCurrentLine; objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt")); while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (objReader != null) objReader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
À noter: Le finally Les blocs sont importants. Cela garantit que objReader.close() s'exécute qu'une exception ait été levée ou non, ce qui libère le descripteur de fichier sous-jacent et conserve gestion de la mémoire prévisible. L'essai imbriqué à l'intérieur finally est requis parce que close() elle-même déclare IOException.
BufferExemple edReader JDK7
À partir de JDK 7, try-with-resources supprime le finally bloc entièrement. Toute ressource déclarée entre parenthèses du try L'instruction est automatiquement fermée à la sortie du bloc, dans l'ordre inverse de sa création, même si une exception se propage :
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample_jdk7 { private static final String FILENAME = "D:\\DukesDiary.txt"; public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) { String strCurrentLine; while ((strCurrentLine = br.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } } }
Cette version est plus courte et plus sûre ; il est donc préférable de l’utiliser dans le nouveau code. La lecture d’un fichier n’est qu’un exemple d’utilisation de cette classe ; la section suivante la compare à l’alternative généralement privilégiée par les débutants.
BufferedReader ou scanner : lequel utiliser ?
Ces deux classes permettent de lire du texte, et les débutants en choisissent souvent une au hasard. Elles résolvent des problèmes différents, et un mauvais choix se traduit soit par une analyse syntaxique manuelle fastidieuse, soit par un faible débit lorsque le volume de données atteint plusieurs milliers de lignes. Le tableau ci-dessous les compare.
| Aspect | BufferedReader | Scanner |
|---|---|---|
| Retours de produits | Lignes entières sous forme de chaîne | Jetons et primitives analysés |
| Analyse intégrée | Non, vous vous séparez ou vous vous convertissez vous-même. | Oui — nextInt, nextDouble, ligne suivante |
| Tampon par défaut | Caractères 8192 | Caractères 1024 |
| Vitesse de traitement des fichiers volumineux | plus rapide | Plus lent, en raison de la tokenisation par expressions régulières |
| Sécurité du fil | Synchérissé | Non synchronisé |
| Meilleur pour | Lecture ligne par ligne des fichiers volumineux | Petite entrée interactive nécessitant des valeurs saisies |
Choisissez BufferUtilisez edReader lorsque l'objectif est de parcourir rapidement un fichier et de manipuler le texte vous-même, et Scanner lorsque vous souhaitez obtenir des valeurs saisies sans écrire de code de conversion. Divisez chaque ligne renvoyée avec le méthode de fractionnement de chaîne donne BufferedReader offre la plupart des avantages du scanner à une vitesse supérieure.
Comment lire les entrées de la console à l'aide de BufferedReader
Cette même classe permet de lire les entrées clavier, ce qui est utile pour les petits programmes en ligne de commande et pour les entrées des défis de programmation. System.in est un flux d'octets, il ne peut donc pas être transmis à BufferedReader directement. Un InputStreamReader fait le lien entre les octets et les caractères, et BufferedReader ajoute ensuite une lecture ligne efficace par-dessus ce pont.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ReadConsoleExample { public static void main(String[] args) throws IOException { // Bridge the System.in byte stream to a character stream try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.print("Enter your name: "); String name = reader.readLine(); System.out.print("Enter your age: "); // readLine always returns text, so convert it explicitly int age = Integer.parseInt(reader.readLine().trim()); System.out.println("Hello " + name + ", age " + age); } } }
Il convient de retenir trois détails. Premièrement, readLine() renvoie toujours une chaîne de caractères, les entrées numériques doivent donc être converties avec Integer.parseInt ou similaire, et une entrée non numérique génère une erreur NumberFormatException — interrompre la conversion si l'entrée n'est pas fiable. Deuxièmement, appeler .trim() supprime le retour chariot final qui Windows Les consoles ajoutent des éléments, une cause fréquente d'échecs d'analyse. Troisièmement, évitez de fermer un lecteur enroulé autour d'un pointeur. System.in si le programme a encore besoin d'une entrée console ultérieurement, car la fermeture du wrapper ferme définitivement le flux sous-jacent pour ce processus.
Pour les programmes qui lisent de nombreuses valeurs, lire une ligne et la diviser est beaucoup plus rapide que d'appeler readLine() de manière répétée, car chaque appel n'accède au système d'exploitation que lorsque le tampon est vide. C'est la principale raison pour laquelle les programmeurs compétitifs préfèrent BufferedReader plutôt que Scanner pour la saisie en masse.
Même avec un code correct, quelques erreurs apparaissent de manière répétée.
Commun BufferErreurs d'edReader et comment les corriger
pont BufferLes erreurs d'edReader proviennent des chemins d'accès aux fichiers, de la gestion des ressources ou de l'encodage des caractères, et non de la boucle de lecture elle-même. Chaque erreur ci-dessous indique l'exception et sa solution.
- Personnage d'évasion illégale : le chemin utilise une seule barre oblique inverse, comme dans
"D:\DukesDiary.txt". Double à"D:\\DukesDiary.txt", ou utilisez une barre oblique, ce qui Java accepte sur Windows. - Exception FileNotFound : Le chemin est relatif au répertoire de travail, et non au fichier source. Imprimer
new File(name).getAbsolutePath()pour voir où Java est en train de regarder. - NullPointerException lors de la première lecture : Le lecteur n'a jamais été assigné car le constructeur a levé une exception qui a été ignorée. Vérifiez le gestion des exceptions avant la boucle.
- Caractères brouillés ou points d'interrogation : le fichier est UTF-8 mais
FileReaderLe jeu de caractères par défaut de la plateforme a été appliqué. Spécifiez explicitement un jeu de caractères, par exemple :new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8). - Flux fermé : Le lecteur a été fermé à l'intérieur de la boucle ou réutilisé après la fin de l'appel à try-with-resources. Ouvrez un nouveau lecteur à chaque passage sur le fichier.
