使用Java编写操作系统事件处理程序

3
我有一个Java进程,作为守护进程运行,它监视文件系统上的一个目录,一旦向该目录添加新文件,Java进程将通过对其执行某些逻辑来处理该文件。目前,在我的实现中,守护进程每隔10秒检查文件夹,如果添加了新文件,它将开始处理它。
是否有一种方法可以使文件夹通知进程已添加新文件,然后进程可以开始处理它?在Java API中,操作系统级别上的文件夹事件处理程序本身是否可以实现这一点?
4个回答

2

我不知道有任何方法。无论如何,对于需要通知的文件夹,您可能需要更改(创建自己的)文件系统驱动程序。

系统事件非常依赖于操作系统,而Java的设计则是相反的。

它取决于您想让您的守护进程多快地响应。使用sleep方法,您可以缩短睡眠时间,但这会使用更多的CPU周期。


2

目前,您可以使用现有的工具,例如jfilenotify,但它将成为Java 7的新功能之一。

您应该设计您的代码,使得通知机制与您的处理程序解耦,从而使您能够轻松升级。


2
我认为你会遇到的问题是对同一文件的并发访问。如果文件仍在被写入,那么你无法独占地访问该文件...而且无法保证文件是否已经有任何数据。你可以利用这个事实来判断文件是否已经完成。
尝试对该文件获取独占锁,如果失败,则表示文件还没有被完全写入。一旦获得了独占锁,那么文件很可能已经完成,你可以按照自己的意愿处理它。
查看java.nio.channels.FileLock,看看它是否适合你的需求。(http://download.oracle.com/javase/6/docs/api/java/nio/channels/FileLock.html)

在目前Java可用的所有文件监视器实现中,都存在并发访问的问题。 - Perception

1
如果你使用的是Java 7,请尝试阅读this。 有一个WatchService类可以处理你想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接