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!

Nenhum comentário:

Postar um comentário