Java 7. try-catch AutoCloseable

Descripción

En Java 7 podemos hacer uso de bloques try-catch sin necesidad de escribir código destinado a cerrar flujos.

Ejemplo:
String fileName = "miFile.txt";
String fileOut = "fileOut.txt";

// Copiar un archivo en otro
try (OutputStream os = new FileOutputStream(fileOut);
     InputStream is = new FileInputStream(fileName);) {
    byte[] buf = new byte[4096];
    int len;
    while ((len = is.read(buf)) > 0) {
        os.write(buf, 0, len);
    }

} catch (IOException ex) {
    Logger.getLogger(App.class.getName()).log(Level.SEVERE, 
        "tryCatch() : copiar archivo", ex);
}

Hay que tener en cuenta que no todo el código se cerrará bien, por ejemplo:
// El siguiente código no se cerrará bien, ya que uno de los 
// objetos (FileReader) no se almacena en una variable.
try (BufferedReader br = new BufferedReader(new FileReader(fileName));) {

    String line;

    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }

} catch (IOException ex) {
    Logger.getLogger(App.class.getName()).log(Level.SEVERE, 
        "tryCatch() : leer archivo", ex);
}

Para que se cierre correctamente habría que hacer:
// Para que se cierre correctamente habría que almacenar cada objeto
// en una variable
try (FileReader fileReader = new FileReader(fileName);
     BufferedReader br = new BufferedReader(fileReader);) {

    String line;

    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }

} catch (IOException ex) {
    Logger.getLogger(App.class.getName()).log(Level.SEVERE, 
        "tryCatch() : leer archivo", ex);
}

Los flujos que se auto cierran implementan la interface AutoCloseable. La interface Closeable hereda de AutoCloseable.
public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

Utilidad

Código más simple, claro de entender y la no inclusión de otro bloque try-catch para cerrar el flujo dentro del catch del primer try.

Comentarios

Entradas populares de este blog

Java. Texto de colores en la consola

javax.swing.JList

javax.swing.JPasswordField