Java:检测文件修改(文件轮询?)

3
什么是Java中检测文件修改的最有效方法?
我已经了解了文件轮询,但随着所监视的文件数量增加,轮询方法会出现一些缺陷。尽管一些在线解决方案似乎指向文件轮询作为推荐的方法,但我不想使用轮询。我希望有一种基于操作系统相关的文件系统更新回调解决方案,这在linux和windows中都可能实现吗?
考虑到我目前只打算“监视”2个文件,因此我仍然可以接受文件轮询解决方案。理想情况下,我希望文件轮询不会对性能产生太大影响。
我知道Java 7的WatchService,但由于7版本还没有正式发布,我不确定是否应该采用这种方法或JNI库。
非常感谢!
编辑:看来文件轮询是正确的选择。如果有人可以推荐实现文件轮询的最安全/高效的方法,那就太好了。

你打算用它来做什么?文件传输吗? - oluies
我计划使用log4j构建日志记录器。因此,我需要一种监视log4j配置文件中任何更改的方法,以便重新加载它。 - user459811
重复问题。https://dev59.com/Tk_Ta4cB1Zd3GeqPBH2j - Emil
2个回答

3

1

目前没有Java解决方案可以让操作系统在文件更改时通知您。虽然可能通过本地调用实现,但每个操作系统在这方面都不同,并且Java肯定不支持此功能。如果可能的话,需要使用JNI进行大量自定义编码。

采用轮询解决方案,只要轮询修改日期,就应该很快。只需确保不要在长时间内保留对文件的引用。始终在轮询周期之间关闭它们,以确保不会创建冲突。


所有我读过的与操作系统文件系统更新回调相关的解决方案都指向 JNI,而我也不愿使用它。我想只能使用文件轮询了!现在要找到最好的解决方案来实现它。 - user459811
就我个人而言,我会编写一些简短、简单、直接的代码来实现我需要的功能。我不会感到惊讶如果 jpoller 能够工作,正如 @Brent 所建议的那样。jnotify 看起来需要安装额外的库,我不喜欢需要这样做的 Java 解决方案。 - Erick Robertson
一定要确保不要长时间保持对文件的引用。你是指在轮询周期之间关闭它们以避免冲突吗?我在考虑始终保持文件轮询活动,因为无法预测用户何时可能要更改文件,因此监听器必须随时准备好检测此类活动。如果始终保持一个实例打开,那么什么时候会发生轮询冲突呢?谢谢! :) - user459811
每个轮询周期结束时,您应该确保关闭所有打开的文件句柄。因此,如果您出于任何原因打开文件,则必须将其关闭。不要让它保持打开状态,直到下一个轮询周期的30秒(或其他时间)。 - Erick Robertson
哦,我明白了,在每个轮询间隔期间关闭打开的所有文件,无论间隔多短。我每秒轮询一次以检查文件的最后修改时间。目前看起来运行良好。希望在进行过程中没有性能问题。感谢您的所有帮助! - user459811

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