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!