Fácil Java

Leitura de arquivo com try-with-resources

Enunciado

Escreva um programa que leia o arquivo dados.txt (crie-o com algumas linhas) e imprima cada linha no console. Use try-with-resources para garantir que o arquivo seja fechado automaticamente.

Requisitos

  • Use BufferedReader dentro de um bloco try-with-resources.
  • Trate a exceção IOException com um bloco catch.
  • Imprima cada linha do arquivo.
  • O programa deve compilar e executar sem erros.

Código inicial

import java.io.*;

public class LeituraArquivo {
    public static void main(String[] args) {
        // Seu código aqui
    }
}

Saída esperada

Linha 1
Linha 2
Linha 3
Ver dica

Use new FileReader("dados.txt") e new BufferedReader(...) no try-with-resources. O método readLine() retorna null no fim do arquivo.

Mostrar solução
import java.io.*;

public class LeituraArquivo {
    public static void main(String[] args) {
        // Cria o arquivo de teste se não existir
        File arquivo = new File("dados.txt");
        if (!arquivo.exists()) {
            try (PrintWriter pw = new PrintWriter(arquivo)) {
                pw.println("Linha 1");
                pw.println("Linha 2");
                pw.println("Linha 3");
            } catch (FileNotFoundException e) {
                System.err.println("Erro ao criar arquivo: " + e.getMessage());
                return;
            }
        }

        // Leitura com try-with-resources
        try (BufferedReader br = new BufferedReader(new FileReader(arquivo))) {
            String linha;
            while ((linha = br.readLine()) != null) {
                System.out.println(linha);
            }
        } catch (IOException e) {
            System.err.println("Erro ao ler arquivo: " + e.getMessage());
        }
    }
}

Passo a passo

  1. Criamos um objeto File para representar o arquivo dados.txt. Se ele não existir, criamos com PrintWriter também dentro de um try-with-resources.
  2. No bloco try, declaramos BufferedReader br = new BufferedReader(new FileReader(arquivo)). Isso abre o arquivo para leitura.
  3. O loop while ((linha = br.readLine()) != null) lê cada linha até o fim do arquivo.
  4. Cada linha lida é impressa com System.out.println(linha).
  5. Ao final do bloco try, o BufferedReader é fechado automaticamente, mesmo se ocorrer uma exceção.
  6. O bloco catch trata possíveis erros de entrada/saída.

Por que funciona

O try-with-resources garante que o método close() do BufferedReader seja chamado automaticamente ao final do bloco, liberando o arquivo. Isso evita vazamentos de recursos e simplifica o código, eliminando a necessidade de um bloco finally explícito.

Erros comuns

  • Esquecer de tratar a exceção: O compilador exige que IOException seja tratada ou declarada. Se não colocar catch nem throws, ocorre erro de compilação.
  • Usar FileReader sem BufferedReader: Funciona, mas é menos eficiente. O BufferedReader melhora a performance com buffer.
  • Não verificar se o arquivo existe: Se o arquivo não existir, FileReader lança FileNotFoundException. Nosso código cria o arquivo antes, mas em outros contextos é preciso tratar.

Outra forma de resolver

Usar Scanner com try-with-resources:

try (Scanner sc = new Scanner(new File("dados.txt"))) {
    while (sc.hasNextLine()) {
        System.out.println(sc.nextLine());
    }
}

É preferível quando se deseja parsing de tipos primitivos.

Saída esperada

Linha 1
Linha 2
Linha 3