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.
