我们的java程序会不断地将一些重要数据写入文件。某些用户手动删除文件(java程序正在编写的文件)时,我们想要在控制台上抛出一些异常或显示某种错误消息。
我发现java在尝试写入已删除的文件时不会抛出任何异常。
方法I - 启动一个新线程,该线程将继续检查文件是否存在,并在删除文件时通知主java程序。这在我们的情况下不起作用,因为我们将有几个java程序将要编写的文件,因此为每个文件启动一个新线程将不会有内存效率。
方法II - 每次在写入文件之前检查文件是否存在。这也不是一个好方法,因为检查文件存在是一个更昂贵的操作。
方法III - 扩展 java.io.FilterWriter (我们用来写入文件)并覆盖 write()方法在尝试写入已删除的文件时抛出异常。这似乎是一个很好的解决方案,但我找不到Java正在消化某些异常的任何地方(当它试图写入已被删除的文件时),我们可以通过覆盖该方法抛出这些异常。
答案 0 :(得分:1)
在这种情况下,FileChannel和FileLock类可能会有所帮助。
答案 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)
在Unix,Linux,Solaris,MacOS,HP / UX,AIX等中,没有办法检测到已删除打开的文件。
在Windows中,无法删除打开的文件。
所以你的问题没有明显的答案。