0Pricing
Java Academy · Aula

Fechando fluxos com segurança

try-with-resources

Fechando fluxos com segurança é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.

Por que fechar fluxos

Fluxos como BufferedReader mantêm recursos do sistema — descritores de arquivo, buffers de memória e conexões. Se você nunca os fechar, esses recursos poderão vazar.

Fechar um fluxo libera o que ele mantém e descarrega todos os dados pendentes. Esta lição mostra como fazer isso com segurança.

O método close

Todo leitor tem um método close(). Chamá-lo libera o recurso.

Para um BufferedReader que encapsula System.in, fechá-lo também fecha os fluxos subjacentes que ele encapsula.

BufferedReader br =
    new BufferedReader(new InputStreamReader(System.in));
// ... use br ...
br.close();

A maneira antiga e arriscada

Você poderia chamar close() manualmente, mas, se ocorrer um erro antes que essa linha seja executada, close() será ignorado e o recurso vazará.

Colocar close() em um bloco finally ajuda, mas é prolixo e fácil de fazer incorretamente.

BufferedReader br = null;
try {
    br = new BufferedReader(
        new InputStreamReader(System.in));
    // ... use br ...
} finally {
    if (br != null) br.close();
}

try com recursos

Java tem uma solução mais limpa: try com recursos. Você declara o fluxo entre parênteses depois de try, e Java o fecha automaticamente quando o bloco termina — mesmo que ocorra um erro.

Sem finally e sem close() manual. Esta é a prática recomendada atualmente.

try (BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in))) {
    String line = br.readLine();
    System.out.println(line);
}

Como funciona

Todo recurso declarado entre os parênteses de try (...) deve implementar AutoCloseable. BufferedReader implementa essa interface, então Java chama o método close() por você.

O fechamento acontece depois que o bloco termina, seja ele encerrado normalmente ou por uma exceção.

Um exemplo completo

Este é um programa completo que usa try com recursos para ler uma linha. O leitor é fechado automaticamente no final do bloco.

Ele lê de System.in, portanto aguarda uma entrada e não pode ser executado automaticamente aqui.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in))) {
            String name = br.readLine();
            System.out.println("Hi " + name);
        }
    }
}

Executável com StringReader

Para demonstrar que o try com recursos funciona sem entrada pelo teclado, aqui o programa lê de um StringReader. Ele pode ser executado integralmente.

Depois do bloco, o leitor é fechado automaticamente — você não escreve nenhuma chamada a close().

import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        try (BufferedReader br =
                new BufferedReader(new StringReader("done"))) {
            System.out.println(br.readLine());
        }
    }
}

Vários recursos

Você pode declarar vários recursos em um único try, separados por ponto e vírgula. Java fecha todos eles na ordem inversa à da declaração.

Isso é útil quando você encapsula vários fluxos juntos.

try (InputStreamReader isr =
        new InputStreamReader(System.in);
     BufferedReader br = new BufferedReader(isr)) {
    System.out.println(br.readLine());
}

Capturando exceções de entrada e saída

A leitura pode lançar IOException. Você pode adicionar um catch a um bloco try com recursos para tratá-la, em vez de declarar throws.

O recurso ainda é fechado automaticamente antes da execução de catch.

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in))) {
    System.out.println(br.readLine());
} catch (IOException e) {
    System.out.println("Read failed");
}

Você deve fechar System.in?

Um cuidado: fechar um leitor de System.in também fecha o próprio System.in, e você não poderá reabri-lo.

Para programas curtos, isso não é um problema. Porém, se você ainda precisar de entrada do console mais tarde, não feche esse leitor específico. Saiba o que o seu fluxo encapsula.

Boas práticas

Para lidar com fluxos com segurança:

  • Prefira try com recursos a close() manual.
  • Ele fecha automaticamente mesmo quando ocorrem erros.
  • Lembre-se de que fechar um leitor de System.in fecha a entrada padrão.

O gerenciamento adequado de recursos evita vazamentos e falhas.

Verificação rápida

Pense no principal benefício do try com recursos.

Recapitulação

Você aprendeu por que os fluxos precisam ser fechados, conheceu a abordagem manual arriscada com finally e o padrão limpo de try com recursos, que fecha automaticamente os recursos AutoCloseable.

Agora você pode ler a entrada com BufferedReader com segurança, do início ao fim.

Perguntas Frequentes

A aula “Fechando fluxos com segurança” é grátis?

Sim — o texto completo de “Fechando fluxos com segurança” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.

O que vou aprender em “Fechando fluxos com segurança”?

try-with-resources Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Fechando fluxos com segurança”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Por que usar BufferedReader
  2. Lendo linhas
  3. Analisando números da entrada
  4. Fechando fluxos com segurança
← Voltar para Java Academy