2010-05-04 19 views

Respuesta

7

Desde el API docs on ZipFile.close():

Cerrando este archivo ZIP se cerrará todos los flujos de entrada previamente devuelto por invocaciones del método getInputStream.

Y InputStream.close() emite una IOException, por lo ZipFile.close() tiene que tirar también. De acuerdo con el API docs for InputStream.close(), arroja un IOException "si se produce un error de E/S". Eso no es muy descriptivo, pero está echando una amplia red. InputStreams puede representar flujos provenientes del sistema de archivos, la red, la memoria, etc. InputStreams puede involucrar almacenamientos intermedios que necesitan ser vaciados, enchufes que deben cerrarse, recursos que deben liberarse, bloqueos que deben liberarse, etc. IOExceptions puede suceder por una variedad de razones.

+0

Si se lanza la excepción en una llamada de lectura() o de escritura(), puedo entender que la lectura o la escritura fallaron. Pero si la excepción se lanza close(), ¿qué falló? –

1

De hombre cercano (2):

No comprobar el valor de retorno de cierre() es un error de programación común, pero sin embargo seria. Es muy posible que los errores en una operación previa de escritura (2) se informen primero en el cierre final(). No verificar el valor de retorno al cerrar el archivo puede provocar la pérdida silenciosa de datos. Esto se puede observar especialmente con NFS y con cuota de disco.

+2

Al cerrar un flujo de solo lectura no se puede lanzar, el marco IO de Java no puede verificarlo ya que no tiene secuencias de lectura contra escritura estáticamente comprobadas. – Joshua

0

no estoy seguro, pero creo que IOException se produce cuando uno de los siguientes eventos ocurren:

  • El archivo zip se eliminó por algo/alguien fuera de la aplicación.
  • Cuando la unidad que contiene el archivo zip se desmonta/desconectado

Mucho más eventos podrían ser la razón pero esos son los dos únicos que podía pensar en este momento.

+0

¿Pero por qué cualquiera de esas condiciones causaría un error al cerrar un ZipFile de solo lectura? – EJP

+0

No mencioné que esas son las únicas condiciones para lanzar la excepción. –

0

La documentación para ZipFile.close() dice:

Cerrando este archivo ZIP se cerrará todos los flujos de entrada previamente devuelto por invocaciones del método getInputStream.

Probablemente el método nativo close está realizando el cierre de InputStreams.

El método close de InputStream tiene IOException como una excepción comprobada.

La causa más probable es un condición de falta de espacio en el sistema de archivos donde se está escribiendo el archivo zip error en el sistema de archivos subyacente. A menos que pueda identificar la causa y solucionarla sobre la marcha, todo lo que puede hacer es informar la condición al usuario.

+0

Al usar un 'InputStream', está * leyendo *, no * escribiendo *, por lo que quedarse sin espacio en el disco debido a que se está escribiendo un archivo zip no podría ser la causa de una' IOException' en las circunstancias de esta discusión . – Asaph

+0

Gracias, corregido. –

Cuestiones relacionadas