Esto parece casi tonto, pero ¿cuál es el patrón más confiable a seguir al cerrar un OutputStream? Ahora mismo tengo algo así como lo siguiente, que sólo parecen ser try-catch-finally-exageración:¿La forma correcta de cerrar un OutputStream en Java?
private void writeContentsToFile(OutputStream ostream, Properties contents) {
try {
contents.store(ostream, "comments");
}
catch (IOException e) {
throw new ResourceException("Failed to write contents", e);
}
finally {
try {
ostream.close();
}
catch (IOException e) { /* what can be done here anyway? */ }
}
}
¿Por qué cerrar lanza una excepción comprobada sigue siendo un misterio para mí. Puedo crear el método de envoltura que hace el bloque de cerrar/capturar, pero si hay algo que ya existe, como FileUtil.closeFileAndThrowUncheckedException()
, me gustaría usarlo. Esto se vuelve un poco más útil cuando tienes muchos proyectos más pequeños con muchos desarrolladores; una forma de hacerlo bien
close() podría escribir datos. si, por ejemplo, una corriente subyacente almacena datos, close() vaciará los datos, y eso podría fallar por la misma razón que una llamada de escritura podría fallar (en el caso de, por ejemplo, sockets, es posible que close() pueda señalar una falla de uno de los también escribe llamadas) – nos
Considera usar un escritor en lugar de trabajar directamente con la transmisión. Los escritores ofrecen muchas comodidades si usa una adaptada a la tarea. Por ejemplo, al almacenar sus propiedades con un 'BufferedWriter' sería una buena opción. Si miras el código fuente, verás que se vacía y cierra la transmisión, aunque igual tendrás que lidiar con la IOException "extra". – Paul
@Paul: Normalmente lo hago, pero utilicé el OutputStream para este caso solo como un ejemplo rápido. –