簡體   English   中英

如何檢測java中的文件系統已經改變

[英]How to detect filesystem has changed in java

我想知道如何在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)

看一下執行此類監控的JNotify

Java 7將為這類工作提供一些更高級的API( WatchService ),這將消除對支持此操作的操作系統的輪詢。

有一個Apache軟件包可以進行文件系統監控:commons.io.monitor。

文檔

一個例子

據我所知,你仍然需要輪詢,盡管你可以控制頻率。

我懷疑有一種純粹的java方法可以做到這一點。 操作系統提供API來監視文件系統的活動。 您可能需要調用這些API。

使用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();
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM