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