我想监视一个目录,当一个文件出现在那里打开它,处理它,然后将它移动到另一个目录。问题是如何检查其他程序是否已完成编写。在 Java 7 中,我可以使用 FileSystem 中的 WatchService,但我只能检查文件的创建时间。我想知道何时释放所有文件句柄。
我的第一个想法是我可以获得一个排他锁,但事实证明可以在另一个应用程序实际更新文件时踢出它。
在 Java 中执行此操作的首选方法是什么?谢谢!
我想监视一个目录,当一个文件出现在那里打开它,处理它,然后将它移动到另一个目录。问题是如何检查其他程序是否已完成编写。在 Java 7 中,我可以使用 FileSystem 中的 WatchService,但我只能检查文件的创建时间。我想知道何时释放所有文件句柄。
我的第一个想法是我可以获得一个排他锁,但事实证明可以在另一个应用程序实际更新文件时踢出它。
在 Java 中执行此操作的首选方法是什么?谢谢!
Watcher API 当前允许您查看在被监视目录中创建、修改或删除文件系统对象时的事件。他们不会告诉您其他 inotify 事件(在 Linux 上)。事实上,我认为在纯 Java 中没有办法做到这一点。
几周前,我自己在寻找一种方法来执行此操作,我遇到了一个邮件线程,该线程建议您可以编写FileSystem
api 的自定义实现,该实现提供支持其他文件系统事件的文件观察器。我决定不追求它,因为我有一个替代解决方案......基于我正在观看的文件的制作方式的知识。
就我而言,这些文件是由将图像文件保存到共享驱动器的仪器生成的。解决方案是查看新创建文件的“修改”事件流。当它停止并且在几秒钟内(“稳定时间”)不再出现时,就可以处理文件了。
如果该解决方案被证明不可靠,则后备方案是直接使用 inotify 调用在 C/C++ 中实现监视和初始处理(获取文件的快照)。这将允许我直接观察文件关闭事件。
基于文件的接口最简单的方法是: