您是否曾见过Java文件close()抛出exception?

有没有人见过在任何可关闭对象上调用close方法时抛出的exception?

如果最终flush失败,将抛出IOException close 。 可能的原因包括:

  • 文件系统已满,或者用户超过配额,
  • 硬盘错误,
  • 文件系统被强制卸载,
  • 由于网络或其他问题,远程文件系统不可用,
  • (可能)如果通过OutputStreamWriter或类似文件写入文件,则会出现字符编码错误,
  • 如果“文件”是设备文件,则设备错误,
  • 如果closeable是网络流,则丢失连接,
  • 如果closeable是外部进程的管道,则管道损坏,
  • 等等。

我当然看到了其中一些。 其他人不太可能。

但是,如果您正在编写的数据很重要,那么您应该允许close失败。 例如,如果您的应用程序正在写出文件系统填满的关键文件,那么您的应用程序在用截断版本替换文件的旧副本之前最好注意这一点。

是的,如果你使用非本地磁盘文件以外的任何东西,它并不罕见,恕我直言。

Close()有效,如果此时你的closable仍然有效并且打开。 管道,远程文件等许多东西都会过早死亡。

另外,我已经看到代码忽略了打开和写入时的错误,仍然试图关闭(例如,在finally块中)。

我没有,但这是可能的。 想象一下,如果有一个OutputStream由于某种原因尚未写入文件。 好吧,调用close()将清除数据,但如果文件被锁定 – 那么将引发IOException

不是在file-io方面,但就套接字而言,当另一方中断连接时,close将引发IOException 。 例如,当您在(大)网页上触发HTTP请求,然后通过单击网页上的另一个链接(当它没有完成加载)立即导航时,服务器端将获得IOException (或类似的子类)当要刷新/关闭HTTP响应的输出ClientAbortException ,Tomcat服务器和克隆中的ClientAbortException。

旧帖和很久以来的答案,但这是一个真实的例子:

以下代码将在调用bufferedWriter.close()时除外。 发生这种情况是因为BufferedWriter的底层Writer(FileWriter)已经关闭,当BufferedWriter关闭时,它首先尝试将其缓冲区中的任何数据刷新到其底层Writer。

 File newFile = new File("newFile.txt"); FileWriter fileWriter = new FileWriter(newFile); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write("Hello World"); fileWriter.close(); bufferedWriter.close(); 

注意 :如果缓冲区中没有数据 [注释掉write()行或添加flush()调用] 则不会生成任何exception

我猜你可以尝试通过拔掉你的文件所在的磁盘来强行执行此操作。 但在任何Closable ? 我认为在关闭时使用套接字来抛出exception很容易。

尝试使用打开的文件来移动USB驱动器。 如果没有例外,我会非常惊讶。

我有 – 在我的unit testing中对抗嘲笑;)