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

时间:2010-05-04 13:31:44

标签: java exception file-io

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

8 个答案:

答案 0 :(得分:27)

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

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

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

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

答案 1 :(得分:6)

是的,如果您使用的是非本地磁盘文件以外的其他任何内容,那就不是那么罕见了。

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

以下代码将在调用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()调用] 那么就不会有异常产生

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:0)

我有 - 在针对嘲笑的单元测试中;)