Java 使用Jnotify忽略文件修改

Java 使用Jnotify忽略文件修改,java,jnotify,Java,Jnotify,我正在用它来写一个应用程序。(JNotify是一个用于检测文件修改的库。) 该应用程序包含以下组件: 写入文件X的文件编写器 监视文件X的文件监视程序(使用JNotify创建) 一种外部应用程序(如记事本),可根据用户要求写入文件X 我希望JNotify仅在使用3修改X时触发通知,并在通过1修改时忽略通知。(或至少通过1和3区分修改) 有没有一个简单的方法,我可以做到这一点?一种方法是让一个同步变量在文件编写器写入时进行切换,但我觉得这不是很优雅 在任何情况下,您都需要在1+2之间进行一些通信以

我正在用它来写一个应用程序。(JNotify是一个用于检测文件修改的库。)

该应用程序包含以下组件:

  • 写入文件X的文件编写器

  • 监视文件X的文件监视程序(使用JNotify创建)

  • 一种外部应用程序(如记事本),可根据用户要求写入文件X

  • 我希望JNotify仅在使用3修改X时触发通知,并在通过1修改时忽略通知。(或至少通过1和3区分修改)


    有没有一个简单的方法,我可以做到这一点?一种方法是让一个同步变量在文件编写器写入时进行切换,但我觉得这不是很优雅

    在任何情况下,您都需要在1+2之间进行一些通信以临时禁用2(至于3,您没有办法这样做)。如果1+2在同一个JVM中运行,那么更合适的方法当然是在公共变量中共享一些状态


    你可能会想到其他聪明的沟通方式。我突然想到:在1开始写之前,它会生成一个锁文件,2也会打开。当完成写入操作后从1中删除锁文件时,2可以在收到关于删除锁文件的通知后继续侦听该文件

    我尝试了两种不同的方法(如下所述,以及我选择的选项)

    • 选项1:使用一个共享布尔变量(即锁),该变量通过1切换为true。当此变量为true时,3不会写入,而是将其设置为false)

    • 选项2:使用文件的共享SHA1散列。写入程序(1)每次写入文件时都会更新哈希。然后,观察者(2)检查修改的文件的散列,并忽略散列是否与共享散列匹配


    我决定使用选项2,因为它工作得非常好。使用选项1是很棘手的,对于每个修改过的文件,JNotify都会触发两次更新(奇怪)

    锁文件似乎是个好主意。但是,当1创建锁文件、写入和删除锁文件时,有时2没有足够的时间。所以现在我在删除锁文件之前使用
    Thread.sleep(1000)
    。。但不是很优雅。虽然在文件上写入时无法控制3,但在1运行时应锁定文件。如果无法锁定文件并且无法进一步控制3,则1+3之间始终可能存在竞争条件。