【问题标题】:How to detect filesystem has changed in java如何在java中检测文件系统已更改
【发布时间】:2010-03-15 22:31:15
【问题描述】:

我想知道如何在java中有效地实现文件系统更改?假设我在文件夹中有一个文件并修改该文件。我希望尽快通过 java 通知此更改(如果可能,不要频繁轮询。)。

因为我认为我可以每隔几秒拨打一次java.io.file.lastModified,但我根本不喜欢那种解决方案的声音。

alfred@alfred-laptop:~/testje$ java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Server VM (build 16.0-b13, mixed mode)

【问题讨论】:

    标签: java file-io filesystems


    【解决方案1】:

    看看JNotify,它执行这种类型的监控。

    Java 7 将为此类工作提供一些更高级的 API (WatchService),这将消除对支持此功能的操作系统的轮询。

    【讨论】:

    • IIRC,JNotify 需要操作系统特定的 DLL。虽然可能没有那么高性能(是的,还不是一个真正的词),但 JPoller 提供了一个纯 Java 实现。
    • 所以在使用 Java7 之前,我认为这总是一个小技巧,因为我认为 Jpoller 的投票很疯狂。 JNotify 不是原生的..
    • 不太清楚您所说的 JNotify 不是本地的是什么意思。它确实需要特定于操作系统的 DLL/库。
    • 我将仔细研究 JNotify,但从我到目前为止从 JNofity 看到的内容来看,它使用了系统特定的解决方案。我希望我在某个地方遗漏了一些东西,只是在我的类路径中放了一个 jar(在 netbeans 中)。接下来调用一个带有回调或其他东西的函数并得到通知。
    • 实际上 JNotify 只调用 Win、OS X 和 Linux 的操作系统特定库。它不支持其他操作系统,也没有轮询机制。 Java 7 WatchService 与 JNotify 基本相同,但如果没有文件系统原生监视工具可使用,则会退回到轮询。
    【解决方案2】:

    我怀疑是否有纯 Java 方法可以做到这一点。操作系统提供 API 来监视文件系统的活动。您可能需要调用这些 API。

    【讨论】:

    • 我根本没有看过它,但认为它实际上是他们在 Java7 中的新文件系统 API 中解决的问题的一部分。归根结底,它当然需要文件系统或操作系统本身的支持。
    【解决方案3】:

    使用 JNotify,你需要做的就是在 buildpath 中添加 jnotify.jar 并将两个 dll 文件,即 jnotify.dll jnotify_64bit.dll 和 jdk 的 lib 中。一个演示程序是

    package jnotify;
    
    import net.contentobjects.jnotify.JNotify;
    import net.contentobjects.jnotify.JNotifyListener;
    
    public class MyJNotify {
      public void sample() throws Exception {
        String path = "Any Folder location here which you want to monitor";
        System.out.println(path);
        int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED
                | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
        boolean watchSubtree = true;
        int watchID = JNotify
                .addWatch(path, mask, watchSubtree, new Listener());
        Thread.sleep(1000000);
        boolean res = JNotify.removeWatch(watchID);
        if (!res) {
            System.out.println("Invalid");
        }
    }
    
    class Listener implements JNotifyListener {
        public void fileRenamed(int wd, String rootPath, String oldName,
                String newName) {
            print("renamed " + rootPath + " : " + oldName + " -> " + newName);
        }
    
        public void fileModified(int wd, String rootPath, String name) {
            print("modified " + rootPath + " : " + name);
        }
    
        public void fileDeleted(int wd, String rootPath, String name) {
            print("deleted " + rootPath + " : " + name);
        }
    
        public void fileCreated(int wd, String rootPath, String name) {
            print("created " + rootPath + " : " + name);
        }
    
        void print(String msg) {
            System.err.println(msg);
        }
    }
    public static void main(String[] args) {
        try {
            new MyJNotify().sample();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    }
    

    【讨论】:

      【解决方案4】:

      有一个 Apache 包可以进行文件系统监控:commons.io.monitor。

      Documentation

      An example

      据我所知,尽管您可以控制频率,但您仍然需要进行轮询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-17
        • 2015-10-14
        • 1970-01-01
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多