【问题标题】:Java - How to detect file deletion while writing to a file?Java - 如何在写入文件时检测文件删除?
【发布时间】:2011-09-20 23:35:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这是 Windows 还是 Unix?您是在每次写入后关闭文件,还是在运行的整个过程中保持打开状态?
  • @Gabe 这是 Unix。在 Windows 中,如果某个文件正在被某个进程使用,则无法删除该文件。
  • 在 Unix 中,无法知道您打开的文件已被删除,因此 Java(或任何其他语言)在发生这种情况时无法抛出异常。
  • 也许将数据写入数据库更好?

标签: java io filewriter writer


【解决方案1】:

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

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

【讨论】:

  • 您所描述的锁定是否会阻止锁定的文件被删除?
  • @Gabe:似乎在 Unix/Linux 下锁定只是建议性的,并不能阻止从其他进程中删除文件。
  • 有时锁定是强制性的(您实际上不能使用被锁定的文件部分),但即便如此我认为它不会阻止您删除锁定的文件。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:
      1. 在 Unix、Linux、Solaris、MacOS、HP/UX、AIX 等中,无法检测到打开的文件已被删除。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多