Mostrando postagens com marcador recursos. Mostrar todas as postagens
Mostrando postagens com marcador recursos. Mostrar todas as postagens

sábado, 12 de março de 2016

Fechando recursos automaticamente em Java

Um recurso útil adicionado ao Java a partir do JDK 7 é o recurso try-with-resources, também conhecido como gerenciamento automático de recursos. Antes da adição deste recurso, para se fechar um arquivo ou algum outro tipo de recurso, usava-se o bloco finally com chamadas explícitas ao método close() das classes de fluxo. Abaixo, segue um código que abre um arquivo e fecha-o usando a metodologia "antiga" (não se esqueça de adicionar import java.io.*;):

FileInputStream fs = null;
try
{
  fs = new FileInputStream("C:\Teste.java");
  do
  {
    i = fs.read();
    if (i != -1)
      System.out.print((char) i);
  } while (i != -1);
}
catch (IOException ex) { 
  System.out.println("Erro de I/O: " + ex);
}
// Esta instrução garante que o arquivo será fechado
finally
  try
  {
    if (fs != null) fs.close();
  }
  catch (IOException ex) {
    System.out.println("Erro ao fechar o arquivo."); 
  }
}

Agora vamos usar o recurso try-with-resources para executar automaticamente o fechamento do recurso (não se esqueça de adicionar import java.io.*;):

try (FileInputStream fs = new FileInputStream("C:\Teste.java"))
{
  do  {
    i = fs.read();
    if (i != -1)
      System.out.print((char) i);
  } while (i != -1);
}
catch (IOException ex) {
  System.out.println("Erro de I/O: " + ex);
}


A diferença entre o tamanho dos códigos é clara. A forma geral de try-with-resources é:
try (especificação do recurso)
{
  // usa o recurso
}

Agora, as regras para se usar try-with-resources:

  • Só pode ser usado com recursos que implementam a interface AutoCloseable (definida em java.lang);
  • O recurso declarado na instrução try é implicitamente final, isto é, ele não pode ser redefinido depois de criado;
  • Instruções catch e finally podem ser usadas em conjunto com try-with-resources;
  • A variável de recurso é local ao bloco try;
  • Mais de um recurso pode ser inicializado na instrução try, bastando-se separá-las por ";" - ponto e vírgula.

Todas as classes de fluxo em Java, implementam as duas interfaces: AutoCloseable e Closeable (definida em java.io), logo, fornecem o método close().
Outra coisa importante a ser mencionada: exceções não são perdidas com try-with-resources. As exceções são suprimidas e podem ser obtidas utilizando-se o método getSupressed() de Throwable.

Se você estiver trabalhando com o JDK 7 ou superior, vai querer utilizar este novo recurso da linguagem!