java.util.zip.ZipFile.close()什么时候抛出IOException?

在什么情况下java.util.zip.ZipFile.close()会抛出IOException? 它的方法签名表明它可以被抛出,但是从源代码中似乎没有任何可能发生这种情况的地方,除非它是在本机代码中。 如果有exception,可以采取哪些纠正措施?

来自ZipFile.close()上的API文档 :

关闭此ZIP文件将关闭先前通过getInputStream方法的调用返回的所有输入流。

并且InputStream.close()抛出一个IOException ,因此ZipFile.close()也必须抛出它。 根据InputStream.close()的API文档,如果发生I / O错误,它会抛出IOException 。 这不是很具描述性,但它正在广泛展示。 InputStreams可以表示来自文件系统,网络,内存等的流.InputStreams可能涉及需要刷新的缓冲区,需要关闭的套接字,需要释放的资源,需要释放的锁等等.IOExceptions可以发生的原因有很多。

从男人关闭(2):

不检查close()的返回值是一个常见但严重的编程错误。 很可能在最后的close()时首先报告先前write(2)操作的错误。 关闭文件时不检查返回值可能会导致数据无声丢失。 使用NFS和磁盘配额尤其可以观察到这种情况。

我不确定,但我认为当发生以下事件之一时会抛出IOException:

  • zip文件被应用程序外部的某些人删除。
  • 当卸载/断开包含zip文件的驱动器时

更多的事件可能是原因,但那些是我现在能想到的唯一两个。

ZipFile.close()的文档说:

关闭此ZIP文件将关闭先前通过getInputStream方法的调用返回的所有输入流。

据推测,本机close方法正在执行关闭InputStreams。

InputStreamclose方法将IOException作为已检查的exception。

最可能的原因是在基础文件系统中写入zip文件时出错的文件系统上的空间不足。 除非您能够确定原因并在运行中解决问题,否则您只需向用户报告该情况即可。