2011-02-09 3 views
17

У меня есть приложение, в котором я хочу прослушать любые изменения, сделанные в конкретном каталоге. Приложение должно пинговать меня, как только будут добавлены, удалены или обновлены файлы в этом каталоге.Слушатель каталога в Java

ответ

21

Вы можете использовать JNotify

JNotify библиотека Java, что позволяет Java-приложение для прослушивания файла системных событий, таких как: создан файл Файла изменен файл переименовывается Файл удален Поддерживаемым платформ

Windows (2000 или новее) Windows примечания Linux с поддержкой INofity (2.6.14 или ) Linux Примечания Mac OS X (1) 0,5 или новее) Mac OS отмечает

Дополнительная информация:

Скачать JNotify из here

Extract молнию, поставить .dll/.so в соответствии с платформы в вашем Lib пути. и создать класс, введите jnotify-0.93.jar в пути к классу.

Пример кода:

package org.life.java.stackoverflow.questions; 

import net.contentobjects.jnotify.JNotify; 
import net.contentobjects.jnotify.JNotifyListener; 

/** 
* 
* @author Jigar 
*/ 
public class JNotifyDemo { 

    public void sample() throws Exception { 
     // path to watch 
     String path = System.getProperty("user.home"); 

     // watch mask, specify events you care about, 
     // or JNotify.FILE_ANY for all events. 
     int mask = JNotify.FILE_CREATED 
       | JNotify.FILE_DELETED 
       | JNotify.FILE_MODIFIED 
       | JNotify.FILE_RENAMED; 

     // watch subtree? 
     boolean watchSubtree = true; 

     // add actual watch 
     int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener()); 

     // sleep a little, the application will exit if you 
     // don't (watching is asynchronous), depending on your 
     // application, this may not be required 
     Thread.sleep(1000000); 

     // to remove watch the watch 
     boolean res = JNotify.removeWatch(watchID); 
     if (!res) { 
      // invalid watch ID specified. 
     } 
    } 

    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) throws Exception { 
     new JNotifyDemo().sample(); 
    } 
} 

Выход:

modified C:\Documents and Settings\jigar: LOCALS~1\Temp\etilqs_4s8ywsvyukghK0uDxRop 
modified C:\Documents and Settings\jigar : LOCALS~1\Temp\etilqs_4s8ywsvyukghK0uDxRop 
modified C:\Documents and Settings\jigar : LOCALS~1\Temp\output1295531079119 
modified C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default 
deleted C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache\f_001ea9 
created C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache\f_001eae 
modified C:\Documents and Settings\jigar : LOCALS~1\Temp\etilqs_04gchL79ZJrpClZIqiom 
modified C:\Documents and Settings\jigar : LOCALS~1\Temp\etilqs_04gchL79ZJrpClZIqiom 
modified C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache 
modified C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache\f_001eae 
modified C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache\f_001eae 
modified C:\Documents and Settings\jigar : LOCALS~1\Temp\output1295531079119 
modified C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Current Session 
deleted C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache\f_001ea8 
created C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache\f_001eaf 
modified C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache 
modified C:\Documents and Settings\jigar : LOCALS~1\Temp\etilqs_04gchL79ZJrpClZIqiom 
modified C:\Documents and Settings\jigar : LOCALS~1\Temp\etilqs_04gchL79ZJrpClZIqiom 
modified C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache\f_001eaf 
modified C:\Documents and Settings\jigar : Local Settings\Application Data\Google\Chrome\User Data\Default\Cache\f_001eaf 
+11

* Downvoters * просьба прокомментировать –

+1

Когда я запускаю программу, она дает мне исключительную библиотеку загрузки ошибок, java.library.path = C : \ Program Files \ Java \ jdk1.7.0 \ bin;.: C: \ Windows \ Sun \ Java \ bin; C: \ Windows \ system32; C: \ Windows; C: \ Windows; C: \ Windows \ system32; C: \ Windows \ system32 \ Wbem; \ WindowsPowerShell \ v1.0 \; C: \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ binn \; C: \ apache-tomcat-6.0.26 \ bin; C: \ Программные файлы \ Java \ jdk1.7.0 \ bin; C: \ Program Files \ TortoiseSVN \ bin; C: \ Program Files \ putty; C: \ Program Files \ Google \ Chrome \ Application; C: \ Program Files \ Java \ jdk1.7.0 \ include Исключение в потоке "main" java.lang.Unsa – Jinith

+0

'Извлеките zip, поместите .dll/.so в соответствии с платформой в вашем пути lib.' –

3

Jnotify для уведомления о файле в java. Пример кода

public void sample() throws Exception { 
     // path to watch  
     String path = System.getProperty("user.home");  
     // watch mask, specify events you care about,  
     // or JNotify.FILE_ANY for all events.  
     int mask = JNotify.FILE_CREATED |     
     JNotify.FILE_DELETED |     
     JNotify.FILE_MODIFIED |     
     JNotify.FILE_RENAMED;  
     // watch subtree? boolean watchSubtree = true;  
     // add actual watch  
     int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());  
     // sleep a little, the application will exit if you  
     // don't (watching is asynchronous), depending on your  
     // application, this may not be required  
     Thread.sleep(1000000);  
     // to remove watch the watch  
     boolean res = JNotify.removeWatch(watchID);  
     if (!res) {  
      // invalid watch ID specified.  
      } 
     } 
    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); } 
     } 
+0

Когда я запускаю программу она дает мне загрузки библиотеки exceptionError, java.library.path = C: \ Program Files \ Java \ jdk1.7.0 \ Bin;; C:. \ Windows \ Sun \ Java \ Bin; C: \ Windows \ system32; C: \ Windows, C: \ Windows, C: \ Windows \ system32; C: \ Windows \ system32 \ Wbem; \ WindowsPowerShell \ v1.0 \; C: \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ binn \; C: \ apache-tomcat-6.0.26 \ bin; C: \ Program Files \ Java \ jdk1 .7.0 \ bin; C: \ Program Files \ TortoiseSVN \ bin; C: \ Program Files \ putty; C: \ Program Files \ Google \ Chrome \ Application; C: \ Program Files \ Java \ jdk1.7.0 \ include Исключение в теме "main" java.lang.Unsa – Jinith

+0

1.- Щелкните правой кнопкой мыши по проекту 2.- Свойства 3.- Нажмите RUN 4.- Параметры VM: java -Djava.library.path = "ваш_path" 5.- например, в моем случае: java -Djava.library.path = 6.- Ok –

20

Поскольку Java 1.7 вы можете использовать Watch Service API для регистрации событий каталога. Он является частью библиотеки Java New I/O (NIO) и не требует дополнительных ресурсов. Пример использования API можно найти в файле official documentation.

После регистрации WatchService вы можете получить события для целевого пути, как это:

for (WatchEvent<?> event: key.pollEvents()) { 
      // Context for directory entry event is the file name of entry 
      WatchEvent<Path> ev = cast(event); 
      Path name = ev.context(); 
      Path child = dir.resolve(name); 

      // print out event 
      System.out.format("%s: %s\n", event.kind().name(), child); 
     } 
Смежные вопросы