Normalmente, solo se puede cerrar la secuencia más externa, ya que, por convención, debe dispararse cerca de las secuencias subyacentes.
Así que normalmente código es el siguiente:
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
...
in.close(); // when you care about Exception-Handling in case when closing fails
}
finally {
IOUtils.closeQuietly(in); // ensure closing; Apache Commons IO
}
Sin embargo puede haber casos excepcionales en los que un constructor de flujo subyacente genera una excepción en los que ya se abrió la corriente. En ese caso, el código anterior no cerrará la secuencia subyacente porque el constructor externo nunca se llamó y in
es nulo. Entonces el bloque final no cierra nada dejando la secuencia subyacente abierta.
Desde Java 7 se puede hacer esto:
try (OutputStream out1 = new ...; OutputStream out2 = new ...) {
...
out1.close(); //if you want Exceptions-Handling; otherwise skip this
out2.close(); //if you want Exceptions-Handling; otherwise skip this
} // out1 and out2 are auto-closed when leaving this block
En la mayoría de los casos que no desea de control de excepciones cuando se eleva al cerrar así que evita estos explícita estrecha() llama.
Editar Aquí hay un código para los no creyentes donde es importante usar este patrón. También puede leer Apache Commons IOUtils javadoc sobre el método closeQuietly().
OutputStream out1 = null;
OutputStream out2 = null;
try {
out1 = new ...;
out2 = new ...;
...
out1.close(); // can be skipped if we do not care about exception-handling while closing
out2.close(); // can be skipped if we ...
}
finally {
/*
* I've some custom methods in my projects overloading these
* closeQuietly() methods with a 2nd param taking a logger instance,
* because usually I do not want to react on Exceptions during close
* but want to see it in the logs when it happened.
*/
IOUtils.closeQuietly(out1);
IOUtils.closeQuietly(out2);
}
Usando @ "consejos" de Tom dejará out1
abrió cuando la creación de out2
genera una excepción. Este consejo es de alguien que habla de It's a continual source of errors for obvious reasons.
Bueno, puedo ser ciego, pero no es obvio para mí. Mi patrón es a prueba de idiotas en cada caso de uso en el que pueda pensar, mientras que el patrón de Tom es propenso a errores.
Posible duplicado de [¿Debo cerrar() tanto FileReader como BufferedReader?] (Http://stackoverflow.com/questions/1388602/do-i-need-to-close-both-filereader-and-bufferedreader) – River