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.

  • ???? Objectif principal : BufferedReader encapsule tout lecteur dont les opรฉrations de lecture sont coรปteuses, rรฉduisant ainsi les lectures individuelles sur le flux sous-jacent.
  • (I.e. Boucle de lecture : readLine renvoie une ligne par appel et null ร  la fin du fichier ; une boucle while sur ce rรฉsultat parcourt donc l'intรฉgralitรฉ du fichier.
  • ๐Ÿงฑ Chemins d'รฉvasion : A Windows chemin ร  l'intรฉrieur d'un Java La chaรฎne de caractรจres nรฉcessite une double barre oblique inverse, sinon le compilateur rejette la sรฉquence d'รฉchappement invalide.
  • โ™ป๏ธ Publication des ressources : La fermeture du lecteur libรจre le descripteur de fichier sous-jacent ; try-with-resources effectue cette fermeture automatiquement.
  • ๏ธ Entrรฉe de la console : enveloppeping System.in dans un InputStreamReader permet ร  la mรชme classe de lire les entrรฉes clavier plutรดt qu'un fichier.
  • ๏ธ Contraste du scanner : BufferedReader est plus rapide et renvoie des lignes brutes, tandis que Scanner analyse directement les jetons et les types primitifs.
  • ๐Ÿ”ค Attention aux caractรจres spรฉciaux : FileReader utilise le jeu de caractรจres par dรฉfaut ; en spรฉcifier un explicitement รฉvite donc lโ€™affichage de caractรจres brouillรฉs sur diffรฉrentes machines.

BufferedReader dans Java

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 FileReader Le 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.

FAQ

Oui. Un deuxiรจme argument du constructeur dรฉfinit la taille du tampon en caractรจres, par exemple. new BufferedReader(reader, 16384)La valeur par dรฉfaut de 8192 convient ร  la plupart des fichiers ; lโ€™augmenter nโ€™est utile que pour les lectures sรฉquentielles trรจs volumineuses.

Pour les petits fichiers, oui : cette fonction renvoie une liste de lignes en un seul appel. Pour les fichiers volumineux, il est prรฉfรฉrable deโ€ฆ Files.newBufferedReader or Files.lines, car readAllLines stocke l'intรฉgralitรฉ du fichier en mรฉmoire en une seule fois.

Oui. AI Les assistants rรฉรฉcrivent le nettoyage du bloc `finally` en blocs `try-with-resources` et suggรจrent des รฉquivalents NIO. Vรฉrifiez ensuite le jeu de caractรจres et le comportement en cas d'exception, car les conversions gรฉnรฉrรฉes omettent souvent l'encodage explicite.

L'IA lit la pile tracCette commande permet d'identifier si la cause est un rรฉpertoire de travail incorrect, une autorisation manquante ou une incompatibilitรฉ d'encodage. Elle simplifie le diagnostic, mais la correction doit tout de mรชme รชtre vรฉrifiรฉe sur le fichier d'origine.

Non. La fonction readLine supprime le caractรจre de fin de ligne ; la chaรฎne renvoyรฉe ne contient donc pas de saut de ligne final. Une ligne vide dans le fichier renvoie par consรฉquent une chaรฎne vide et non la valeur null.

Rรฉsumez cet article avec :