2010-03-15 3 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을 살펴보십시오.

자바 7에는 이러한 종류의 작업을위한 고급 API (WatchService)가 포함되어있어이를 지원하는 OS에서 폴링을 제거합니다.

+1

IIRC, JNotify는 OS 특정 DLL이 필요합니다. 실행 가능성이 높지는 않지만 (예, 실제 단어는 아님) JPoller는 순수 Java 구현을 제공합니다. –

+0

Jpoller가 미친 듯이 여론 조사를한다고 생각하기 때문에 Java7을 사용하기 전까지는 항상 약간의 해킹이 발생합니다. JNotify는 네이티브가 아닙니다. – Alfred

+0

JNotify가 원주민이 아닌 것을 의미하는 것이 확실하지 않습니다. OS 별 DLL/라이브러리가 필요합니다. –

1

나는 이것을 수행하기위한 순수한 자바 방법이 있는지 의심 스럽다. 운영 체제는 파일 시스템 활동을 모니터하는 API를 제공합니다. 아마도 이러한 API를 호출해야 할 것입니다.

+0

전혀 보지 못했지만 실제로는 Java7의 새로운 파일 시스템 API에서 다루는 부분이라고 생각합니다. 하루가 끝나면 파일 시스템이나 OS 자체의 지원이 필요합니다. – Fredrik

1

JNotify를 사용하십시오. 빌드 경로에 jnotify.jar을 추가하고 jnotify.dll jnotify_64bit.dll과 jdk의 lib 안에 두 개의 dll 파일을 넣기 만하면됩니다. 데모 프로그램은

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. 내가 무엇을 말할 수에서

An example

Documentation

, 당신은 아직도 당신이 주파수를 제어 할 수이기는하지만 폴링해야합니다.

관련 문제