2011-12-27 107 views
1

我想监视一个目录,当出现文件时打开它,处理它,然后将其移动到另一个目录。问题是如何检查其他程序是否完成了写入。在Java 7中,我可以使用FileSystem中的WatchService,但我只能检查文件的创建时间。我想要的是知道何时发布所有文件句柄。检查何时在Java中释放所有文件句柄

我的第一个想法是,我可以获得排他锁,但事实证明,它可能在实际更新文件的同时启动另一个应用程序。

在Java中这样做的首选方式是什么?谢谢!

+1

你能做的唯一的事情就是寻找这表示它计划已完成文件与那一个。 – 2011-12-27 09:59:51

+0

@PeterLawrey:不幸的是,我的程序应该能够从任何可以生成它们的程序中获取文件,并且我无法让它们创建其他文件。 – 2012-02-16 10:16:28

回答

1

Watcher API当前允许您在观察目录中创建,修改或删除文件系统对象时查看事件。他们不会告诉你其他inotify事件(在Linux上)。事实上,我认为在纯Java中没有办法做到这一点。


我一直在寻找一种方法来此做自己几个星期前,我碰到一个邮件线程建议你可以写FileSystem API,它提供了支持的其他文件的文件守望者的自定义实现来系统事件。我决定不去追求它,因为我有一个替代解决方案......基于我正在观看的文件是如何产生的知识。

在我的情况下,这些文件是通过将图像文件保存到共享驱动器的工具生成的。解决方案是观察新创建文件的“修改”事件流。当它停止并且不再有几秒钟(“建立时间”)时,文件可以被处理。

如果此解决方案证明不可靠,则回退是使用inotify调用直接在C/C++中实现观察和初始处理(拍摄文件快照)。这将允许我直接观察文件关闭事件。

+0

谢谢!这就说得通了。我最终做的是放弃'WatchService',而是在给定的时间点拍摄目录中的文件的快照,然后在几秒钟之后拍摄一个新的文件。这些快照的交集中未改变的文件被认为是安全处理。如果稍后我会收到关于这个错误的报告,我会考虑重写它,但现在我只是假设它符合要求。 – 2012-02-16 10:12:34

1

的基于文件的界面最简单的方法是:

  1. 发送者与更改的文件名(如“example.xml_”)
  2. 当发送者已经写完的文件,他写道:重命名文件它(例如,“example.xml_”到“的example.xml”)
  3. 接收器扫描只为“* .XML”
+1

1)这只有在您控制了创建文件的任何东西时才有效,并且可以对其进行修改(如有必要)以重命名它们。 2)扫描涉及轮询,效率低下。使用'WatchService'。 – 2012-01-03 23:31:42