Java BufferedReader: Como ler um arquivo com exemplo

⚡ Resumo Inteligente

Java BufferO edReader lê texto de um fluxo de entrada armazenando caracteres em buffer, o que torna a leitura de arquivos linha por linha rápida e simples.ping um FileReader dentro BufferedReader e banheiroping Ao ler uma linha até que ela retorne nulo, o arquivo inteiro é impresso.

  • 📖 Objetivo principal: BufferO edReader encapsula qualquer Reader cujas operações de leitura sejam custosas, reduzindo as leituras individuais no fluxo subjacente.
  • 🔁 Loop de leitura: A função readLine retorna uma linha por chamada e null no final do arquivo, portanto, um loop while nesse resultado percorre o arquivo inteiro.
  • 🧱 Caminhos de fuga: A Windows caminho dentro de um Java A string precisa de uma barra invertida dupla; caso contrário, o compilador rejeita a sequência de escape inválida.
  • ♻️ Liberação de recursos: Fechar o leitor libera o identificador de arquivo subjacente; o try-with-resources realiza esse fechamento automaticamente.
  • ⌨️ Entrada do console: Embrulheping O System.in em um InputStreamReader permite que a mesma classe leia a entrada do teclado em vez de um arquivo.
  • ⚖️ Contraste do scanner: BufferO edReader é mais rápido e retorna linhas brutas, enquanto o Scanner analisa tokens e tipos primitivos diretamente.
  • 🔤 Atenção: Conjunto de caracteres recomendado O FileReader utiliza o conjunto de caracteres padrão, portanto, especificar um explicitamente evita caracteres ilegíveis entre diferentes máquinas.

BufferedReader em Java

Como ler um arquivo em Java?

Java Oferece diversos mecanismos para ler de um arquivo. O pacote mais útil para isso é java.io, cujos abdominaistract Reader A classe define a leitura de fluxo de caracteres. java.io.BufferedReader é a subclasse concreta usada para leitura eficiente baseada em linhas.

O que é a BufferedReader em Java?

BufferedReader é um Java Classe que lê texto de um fluxo de entrada, como um arquivo, armazenando caracteres em buffer para que caracteres, arrays e linhas sejam lidos de forma eficiente. Sem o armazenamento em buffer, cada solicitação de leitura feita a um Reader aciona uma solicitação de leitura correspondente no fluxo de caracteres ou bytes subjacente.

Portanto, é aconselhável embrulhar BufferedReader em torno de qualquer Reader cujo read() As operações podem ser dispendiosas, tais como: FileReader e InputStreamReaderUm uso típico passa o caminho do arquivo para o leitor da seguinte forma:

// Note the doubled backslash: a single \ starts an escape sequence
objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));

Isso carrega o arquivo em objReaderEm seguida, você percorre o conteúdo do arquivo e imprime cada linha. O loop while no código abaixo lê o arquivo até chegar ao final.

while ((strCurrentLine = objReader.readLine()) != null) {
    System.out.println(strCurrentLine);
}

strCurrentLine mantém a linha atual, e objReader.readLine() Retorna uma String. O loop, portanto, continua iterando enquanto o valor retornado não for nulo e para no primeiro valor nulo, que sinaliza o fim do arquivo.

BufferExemplo de edReader

O código abaixo é um completo Java BufferExemplo de 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();
            }
        }
    }
}

Observação: O finally A importância do bloco. Ele garante que objReader.close() A execução ocorre independentemente de uma exceção ter sido lançada ou não, liberando o identificador de arquivo subjacente e mantendo-o ativo. gerenciamento de memória previsível. A tentativa aninhada dentro finally é necessário porque close() declara IOException.

BufferExemplo de edReader JDK7

A partir do JDK 7, o try-with-resources remove o finally bloco inteiro. Qualquer recurso declarado entre parênteses do try A instrução é fechada automaticamente quando o bloco termina, na ordem inversa de sua criação, mesmo que uma exceção se propague:

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();
        }
    }
}

Esta versão é mais curta e segura, sendo, portanto, a forma preferencial em novos códigos. A leitura de um arquivo é apenas um dos usos da classe; a próxima seção a compara com a alternativa que a maioria dos iniciantes utiliza primeiro.

BufferedReader ou scanner: qual usar?

Ambas as classes leem texto, e os iniciantes costumam escolher uma delas arbitrariamente. Elas resolvem problemas diferentes, e a escolha errada se manifesta como uma análise manual desajeitada ou um baixo desempenho quando a entrada chega a milhares de linhas. A tabela abaixo as compara lado a lado.

Aspecto BufferedReader Scanner
Returns Linhas inteiras como string Tokens e tipos primitivos analisados
Análise sintática integrada Não — você se divide ou se converte. Sim — nextInt, próximoDouble, próxima linha
Buffer padrão 8192 caracteres 1024 caracteres
Velocidade em arquivos grandes Mais rápido Mais lento, devido à tokenização por expressões regulares.
Segurança da rosca Synccronizado Não sincronizado
Melhor para Lendo arquivos grandes linha por linha Pequeno campo de entrada interativo que requer valores digitados.

Escolha BufferedReader quando o objetivo é percorrer um arquivo rapidamente e manipular o texto manualmente, e Scanner quando você deseja valores digitados sem escrever código de conversão. Dividindo cada linha retornada com o Método de divisão de string dá BufferO edReader oferece a maior parte da praticidade do Scanner em alta velocidade.

Como ler a entrada do console usando BufferedReader

A mesma classe lê a entrada do teclado, o que é útil para pequenos programas de linha de comando e para entrada em desafios de programação. System.in é um fluxo de bytes, portanto não pode ser entregue a BufferedReader diretamente. Um InputStreamReader faz a ponte entre bytes e caracteres, e BufferO edReader adiciona então uma leitura de linha eficiente sobre essa ponte.

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);
        }
    }
}

Três detalhes merecem ser lembrados. Primeiro, readLine() sempre retorna uma String, portanto, a entrada numérica deve ser convertida com Integer.parseInt ou similar, e uma entrada não numérica gera um erro. NumberFormatException — Envolva a conversão se a entrada não for confiável. Em segundo lugar, chame .trim() remove o retorno de carro final que Windows consoles append, uma causa frequente de falhas de análise. Terceiro, evite fechar um leitor que esteja envolvido em System.in Se o programa ainda precisar de entrada do console posteriormente, isso ocorre porque fechar o wrapper encerra permanentemente o fluxo subjacente para esse processo.

Para programas que leem muitos valores, ler uma linha e dividi-la é muito mais rápido do que chamar uma função. readLine() repetidamente, já que cada chamada só acessa o sistema operacional quando o buffer está vazio. Essa é a principal razão pela qual programadores competitivos preferem BufferedReader sobre Scanner para entrada em massa.

Mesmo com o código correto, alguns erros aparecem repetidamente.

comum BufferErros do edReader e como corrigi-los

Os mais BufferAs falhas do edReader decorrem de caminhos de arquivo, gerenciamento de recursos ou codificação de caracteres, e não do próprio loop de leitura. Cada erro abaixo indica sua exceção e sua solução.

  • Personagem de fuga ilegal: O caminho usa uma única barra invertida, como em "D:\DukesDiary.txt". Double a "D:\\DukesDiary.txt"ou use uma barra invertida, que Java aceita em Windows.
  • Exceção FileNotFoundException: O caminho é relativo ao diretório de trabalho, não ao arquivo de origem. Imprimir new File(name).getAbsolutePath() para ver onde Java está realmente procurando.
  • NullPointerException na primeira leitura: O leitor nunca foi atribuído porque o construtor lançou uma exceção, e esta foi ignorada. Verifique o manipulação de exceção antes do loop.
  • Caracteres ilegíveis ou em forma de ponto de interrogação: O arquivo é UTF-8, mas FileReader Foi aplicado o conjunto de caracteres padrão da plataforma. Você pode especificar um conjunto de caracteres explicitamente, por exemplo. new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8).
  • Transmissão encerrada: O leitor foi fechado dentro do loop ou reutilizado após o término do try-with-resources. Abra um novo leitor para cada iteração sobre o arquivo.

Perguntas Frequentes

Sim. Um segundo argumento do construtor define o buffer em caracteres, por exemplo. new BufferedReader(reader, 16384)O valor padrão de 8192 é adequado para a maioria dos arquivos; aumentá-lo só ajuda em leituras sequenciais muito grandes.

Para arquivos pequenos, sim — retorna uma lista de linhas em uma única chamada. Para arquivos grandes, prefira Files.newBufferedReader or Files.lines, porque readAllLines mantém o arquivo inteiro na memória de uma só vez.

Sim. Travas deslizantes portáteis AI Os assistentes reescrevem a limpeza do bloco `finally` em um bloco `try-with-resources` e sugerem equivalentes em NIO. Verifique o conjunto de caracteres e o comportamento de exceções posteriormente, pois as conversões geradas geralmente descartam a codificação explícita.

A IA lê a pilha tracO comando identifica se a causa é um diretório de trabalho incorreto, uma permissão ausente ou uma incompatibilidade de codificação. Ele agiliza o diagnóstico, embora a correção ainda precise ser verificada no arquivo real.

Não. A função `readLine` remove o terminador de linha, portanto, a string retornada não contém nenhuma quebra de linha no final. Uma linha vazia no arquivo, portanto, retorna uma string vazia em vez de nula.

Resuma esta postagem com: