Nuevo en Java 7, Manejo Automatico de Recursos
Dec 21
El manejo de excepciones es un trabajo complicado cuando se trata de manejo de recursos como archivos, por ejemplo si queremos abrir un archivo, leer todos los datos y copiarlos en otro archivo, el código sin manejo de excepciones seria algo así :
FileInputStream fis = new FileInputStream("origen.txt");
FileOutputStream fos = new FileOutputStream("destino.txt");
while(fis.available() < 0)
fos.write(fis.read());
fis.close();
fos.close();
Ahora pensemos en como manejaríamos las excepciones, por ejemplo la forma mas sencilla seria tener un solo bloque con el código y capturar por ejemplo cualquier excepción posible, costumbre que muchos desarrolladores tienen :
try {
FileInputStream fis = new FileInputStream("origen.txt");
FileOutputStream fos = new FileOutputStream("destino.txt");
while (fis.available() > 0) {
fos.write(fis.read());
}
fis.close();
fos.close();
} catch (Exception e) {
System.err.println(e.getMessage());
}
Pero que pasaría si por algún motivo mientras leemos sucede alguna excepción, como cerramos el archivo que estábamos escribiendo, lo borramos, que hacemos, así que debemos comenzar a manejar cada excepción y sus consecuencias por aparte. En el caso mas sencillo simplemente pensemos en cerrar el archivo de salida donde estábamos escribiendo, como lo haríamos ? con bloques de manejo de excepciones anidados de tal modo que si sucede una excepción mientras estamos leyendo, en el catch cerremos el archivo de salida, lo que conlleva de nuevo a tener un nuevo bloque de manejo de excepción :
FileOutputStream fos = null;
try {
FileInputStream fis = new FileInputStream("origen.txt");
fos = new FileOutputStream("destino.txt");
while(fis.available() > 0)
fos.write(fis.read());
fis.close();
fos.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
El manejo automático de recursos que aparece en Java 7 permite que se cierren los recursos una vez abiertos si se especifican dichos recursos dentro del try, de tal forma que si sucede algún error la aplicación es capaz de cerrar el recurso :
try (FileInputStream fis = new FileInputStream("origen.txt");
FileOutputStream fos = new FileOutputStream("destino.txt"))
while(fis.available() > 0)
fos.write(fis.read());
}
catch(Exception e) {
e.printStackTrace();
}
Esto especifica que los recursos fis y fos deben cerrarse después de ejecutar el bloque del try, se haya lanzado una excepción o no.
Enlaces :

