Leitura com FileReader e BufferedReader em Java

A leitura de arquivos é uma tarefa comum em aplicações Java, principalmente para processamento de dados e configuração de sistemas. Este tutorial apresenta como utilizar as classes FileReader e BufferedReader para realizar a leitura de arquivos de texto de maneira eficiente.


Visão Geral das Classes

FileReader

  • A classe FileReader é usada para ler dados de arquivos como uma sequência de caracteres.
  • É ideal para arquivos de texto simples.
  • É uma classe básica, mas não é a opção mais eficiente para leitura de grandes arquivos.

BufferedReader

  • O BufferedReader encapsula um objeto Reader (como o FileReader) e oferece uma leitura mais eficiente por usar buffers para armazenar os dados lidos.
  • Permite a leitura de arquivos linha a linha, o que facilita o processamento de grandes volumes de texto.

Configuração Inicial

Antes de começar, certifique-se de que o arquivo que deseja ler esteja localizado no sistema de arquivos. Para o exemplo, usaremos um arquivo chamado dados.txt.

Exemplo de Arquivo (dados.txt)

Java é uma linguagem poderosa.
Aprender Java é essencial para muitos desenvolvedores.
Este é um exemplo de leitura de arquivos.

Leitura com FileReader

A abordagem básica para ler um arquivo com FileReader é demonstrada abaixo:

Exemplo:

import java.io.FileReader;
import java.io.IOException;

public class LeituraComFileReader {
    public static void main(String[] args) {
        try (FileReader reader = new FileReader("dados.txt")) {
            int caractere;

            while ((caractere = reader.read()) != -1) { // Lê caractere por caractere
                System.out.print((char) caractere);    // Converte o inteiro para caractere
            }
        } catch (IOException e) {
            System.out.println("Erro ao ler o arquivo: " + e.getMessage());
        }
    }
}

Saída:

Java é uma linguagem poderosa.
Aprender Java é essencial para muitos desenvolvedores.
Este é um exemplo de leitura de arquivos.

Leitura com BufferedReader

O BufferedReader é mais eficiente e adequado para leitura de arquivos linha a linha. Isso é particularmente útil quando você trabalha com arquivos grandes.

Exemplo:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LeituraComBufferedReader {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("dados.txt"))) {
            String linha;

            while ((linha = reader.readLine()) != null) { // Lê linha por linha
                System.out.println(linha);
            }
        } catch (IOException e) {
            System.out.println("Erro ao ler o arquivo: " + e.getMessage());
        }
    }
}

Saída:

Java é uma linguagem poderosa.
Aprender Java é essencial para muitos desenvolvedores.
Este é um exemplo de leitura de arquivos.

Diferenças Entre FileReader e BufferedReader

CaracterísticaFileReaderBufferedReader
Modo de LeituraCaractere por caractereLinha por linha
EficiênciaMenos eficienteMais eficiente
BufferNão utiliza bufferUtiliza buffer interno
Uso IdealPequenos arquivosGrandes arquivos ou leitura por linhas

Exemplo Completo: Contar Linhas, Palavras e Caracteres

O exemplo abaixo demonstra como usar o BufferedReader para processar um arquivo e contar o número de linhas, palavras e caracteres:

Código:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ContarElementosDoArquivo {
    public static void main(String[] args) {
        int linhas = 0;
        int palavras = 0;
        int caracteres = 0;

        try (BufferedReader reader = new BufferedReader(new FileReader("dados.txt"))) {
            String linha;

            while ((linha = reader.readLine()) != null) {
                linhas++; // Incrementa o contador de linhas
                caracteres += linha.length(); // Soma os caracteres da linha
                palavras += linha.split("\\s+").length; // Conta palavras com base nos espaços
            }

            System.out.println("Número de linhas: " + linhas);
            System.out.println("Número de palavras: " + palavras);
            System.out.println("Número de caracteres: " + caracteres);
        } catch (IOException e) {
            System.out.println("Erro ao processar o arquivo: " + e.getMessage());
        }
    }
}

Saída (para o arquivo dados.txt):

Número de linhas: 3
Número de palavras: 18
Número de caracteres: 109

Boas Práticas

  1. Fechar os Recursos: Use a sintaxe try-with-resources para fechar automaticamente o arquivo após o uso.
  2. Tratamento de Exceções: Sempre capture exceções como IOException para lidar com erros de leitura.
  3. Caminhos Relativos e Absolutos: Certifique-se de que o arquivo está no local correto. Para testes, use caminhos absolutos para evitar confusões.
  4. Escolha a Abordagem Adequada: Use BufferedReader para leitura eficiente, especialmente em arquivos grandes ou quando a leitura linha a linha for necessária.

Conclusão

Neste tutorial, exploramos as classes FileReader e BufferedReader para leitura de arquivos em Java. O uso dessas ferramentas é fundamental para lidar com entrada de dados baseada em arquivos. Escolher entre FileReader e BufferedReader depende da necessidade específica do programa, mas geralmente o BufferedReader é a escolha mais robusta e eficiente. Experimente os exemplos fornecidos para entender melhor essas classes e suas aplicações.