Java - 如何在写入文件时检测文件删除?

时间:2011-06-23 07:02:13

标签: java io filewriter writer

我们的java程序会不断地将一些重要数据写入文件。某些用户手动删除文件(java程序正在编写的文件)时,我们想要在控制台上抛出一些异常或显示某种错误消息。

我发现java在尝试写入已删除的文件时不会抛出任何异常。

方法I - 启动一个新线程,该线程将继续检查文件是否存在,并在删除文件时通知主java程序。这在我们的情况下不起作用,因为我们将有几个java程序将要编写的文件,因此为每个文件启动一个新线程将不会有内存效率。

方法II - 每次在写入文件之前检查文件是否存在。这也不是一个好方法,因为检查文件存在是一个更昂贵的操作。

方法III - 扩展 java.io.FilterWriter (我们用来写入文件)并覆盖 write()方法在尝试写入已删除的文件时抛出异常。这似乎是一个很好的解决方案,但我找不到Java正在消化某些异常的任何地方(当它试图写入已被删除的文件时),我们可以通过覆盖该方法抛出这些异常。

4 个答案:

答案 0 :(得分:1)

在这种情况下,FileChannelFileLock类可能会有所帮助。

请参阅How can I lock a file using java (if possible)

答案 1 :(得分:1)

在Unix下,有文件和目录。文件可以出现在任意数量的目录中,打开的文件可以在磁盘上但不会出现在任何目录中。如果从更改目录的目录中删除文件,而不是文件。

要确定目录是否已更改,您需要使用File.exists()轮询其路径。 Java 7有一个目录观察器,可以避免轮询。

答案 2 :(得分:1)

首先,我怀疑,如果您尝试写入丢失的文件,java将不会抛出异常。可能发生的情况是,在unix下,文件被用户删除但进程仍然写入备份文件(自己的副本)

看看apache commons io文件监视包: http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html 基本上,您可以为不同的事件(文件删除,目录删除等)和监听器注册监听器。

如果你想阻止删除,我会看一下@splash的评论。 另一种选择是写入您自己的临时目录中的隐藏文件。

答案 3 :(得分:-1)

  1. 在Unix,Linux,Solaris,MacOS,HP / UX,AIX等中,没有办法检测到已删除打开的文件。

  2. 在Windows中,无法删除打开的文件。

  3. 所以你的问题没有明显的答案。