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.infecha 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
- Por que usar BufferedReader
- Lendo linhas
- Analisando números da entrada
- Fechando fluxos com segurança