11

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

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

方法 I -启动一个新线程,该线程将继续检查文件是否存在,并在文件被删除时通知主 java 程序。这在我们的例子中是行不通的,因为我们将有几个 java 程序将写入的文件,因此为每个文件启动一个新线程不会节省内存。

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

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

4

4 回答 4

1

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

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

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

于 2011-06-23T09:10:55.170 回答
1

在 Unix 下,有文件,也有目录。一个文件可以出现在任意多个目录中,打开的文件可以在磁盘上但不出现在任何目录中。如果从目录中删除文件是对目录的更改,而不是对文件的更改。

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

于 2011-06-23T07:37:06.393 回答
1

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

请参阅如何使用 java 锁定文件(如果可能)

于 2011-06-23T07:04:42.117 回答
-1
  1. 在 Unix、Linux、Solaris、MacOS、HP/UX、AIX 等中,无法检测到打开的文件已被删除。

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

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

于 2011-06-23T09:15:09.887 回答