2010-03-15 46 views
4

我想知道如何有效地實現java中的文件系統更改?假設我在文件夾中有一個文件並修改該文件。我希望儘快通過java通知有關此更改(如果可能,請不要頻繁輪詢)。如何檢測java中的文件系統已更改

因爲我認爲我可以每隔幾秒鐘撥打java.io.file.lastModified,但我不喜歡那個解決方案的聲音。

[email protected]:~/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) 

回答

8

看看JNotify,它執行這種類型的監測。

對於這類工作,Java 7將擁有一些更高級的API(WatchService),這將消除對支持此功能的操作系統的輪詢。

+1

IIRC,JNotify需要操作系統特定的DLL。雖然可能不如性能(是的,還不是一個真正的詞),JPoller提供了一個純粹的Java實現。 – 2010-03-15 22:39:50

+0

因此,直到使用Java7時,我總是有點破解,因爲我認爲Jpoller民意調查很瘋狂。 JNotify不是原生的。 – Alfred 2010-03-15 23:02:32

+0

不太確定您的意思是JNotify不是原生的。它確實需要特定於操作系統的DLL /庫。 – 2010-03-15 23:04:00

1

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

+0

我沒有看過它,但認爲它實際上是它們在Java7中的新文件系統API中解決的一部分。在一天結束時,它當然需要文件系統或操作系統本身的支持。 – Fredrik 2010-03-15 22:36:19

1

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

有一個用於執行文件系統監視的Apache軟件包:commons.io.monitor。

Documentation

An example

從我可以告訴,你仍然需要輪詢儘管你有在頻率控制。