国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Java實現實時監(jiān)控目錄下文件變化的方法

2024-07-14 08:43:34
字體:
來源:轉載
供稿:網友

一、commons-io方法

1、使用Commons-io的monitor下的相關類可以處理對文件進行監(jiān)控,它采用的是觀察者模式來實現的

  • (1)可以監(jiān)控文件夾的創(chuàng)建、刪除和修改
  • (2)可以監(jiān)控文件的創(chuàng)建、刪除和修改
  • (3)采用的是觀察者模式來實現的
  • (4)采用線程去定時去刷新檢測文件的變化情況

2、引入commons-io包,需要2.0以上。

<!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency>  <groupId>commons-io</groupId>  <artifactId>commons-io</artifactId>  <version>2.6</version></dependency>

3、編寫繼承FileAlterationListenerAdaptor的類FileListener。

import java.io.File;import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;import org.apache.commons.io.monitor.FileAlterationObserver;import org.apache.log4j.Logger;/** * 文件變化監(jiān)聽器 * 在Apache的Commons-IO中有關于文件的監(jiān)控功能的代碼. 文件監(jiān)控的原理如下: * 由文件監(jiān)控類FileAlterationMonitor中的線程不停的掃描文件觀察器FileAlterationObserver, * 如果有文件的變化,則根據相關的文件比較器,判斷文件時新增,還是刪除,還是更改。(默認為1000毫秒執(zhí)行一次掃描) */public class FileListener extends FileAlterationListenerAdaptor {  private Logger log = Logger.getLogger(FileListener.class);  /**   * 文件創(chuàng)建執(zhí)行   */  public void onFileCreate(File file) {    log.info("[新建]:" + file.getAbsolutePath());  }  /**   * 文件創(chuàng)建修改   */  public void onFileChange(File file) {    log.info("[修改]:" + file.getAbsolutePath());  }  /**   * 文件刪除   */  public void onFileDelete(File file) {    log.info("[刪除]:" + file.getAbsolutePath());  }  /**   * 目錄創(chuàng)建   */  public void onDirectoryCreate(File directory) {    log.info("[新建]:" + directory.getAbsolutePath());  }  /**   * 目錄修改   */  public void onDirectoryChange(File directory) {    log.info("[修改]:" + directory.getAbsolutePath());  }  /**   * 目錄刪除   */  public void onDirectoryDelete(File directory) {    log.info("[刪除]:" + directory.getAbsolutePath());  }  public void onStart(FileAlterationObserver observer) {    // TODO Auto-generated method stub    super.onStart(observer);  }  public void onStop(FileAlterationObserver observer) {    // TODO Auto-generated method stub    super.onStop(observer);  }}

4、實現main方法

public static void main(String[] args) throws Exception{    // 監(jiān)控目錄    String rootDir = "D://apache-tomcat-7.0.78";    // 輪詢間隔 5 秒    long interval = TimeUnit.SECONDS.toMillis(1);    // 創(chuàng)建過濾器    IOFileFilter directories = FileFilterUtils.and(        FileFilterUtils.directoryFileFilter(),        HiddenFileFilter.VISIBLE);    IOFileFilter files    = FileFilterUtils.and(        FileFilterUtils.fileFileFilter(),        FileFilterUtils.suffixFileFilter(".txt"));    IOFileFilter filter = FileFilterUtils.or(directories, files);    // 使用過濾器    FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), filter);    //不使用過濾器    //FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));    observer.addListener(new FileListener());    //創(chuàng)建文件變化監(jiān)聽器    FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);    // 開始監(jiān)控    monitor.start();  }

二、使用JDK7提供的WatchService

public static void main(String[] a) {    final Path path = Paths.get("D://apache-tomcat-7.0.78");    try (WatchService watchService = FileSystems.getDefault().newWatchService()) {      //給path路徑加上文件觀察服務      path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,          StandardWatchEventKinds.ENTRY_MODIFY,          StandardWatchEventKinds.ENTRY_DELETE);      while (true) {        final WatchKey key = watchService.take();        for (WatchEvent<?> watchEvent : key.pollEvents()) {          final WatchEvent.Kind<?> kind = watchEvent.kind();          if (kind == StandardWatchEventKinds.OVERFLOW) {            continue;          }          //創(chuàng)建事件          if (kind == StandardWatchEventKinds.ENTRY_CREATE) {            System.out.println("[新建]");          }          //修改事件          if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {            System.out.println("修改]");          }          //刪除事件          if (kind == StandardWatchEventKinds.ENTRY_DELETE) {            System.out.println("[刪除]");          }          // get the filename for the event          final WatchEvent<Path> watchEventPath = (WatchEvent<Path>) watchEvent;          final Path filename = watchEventPath.context();          // print it out          System.out.println(kind + " -> " + filename);        }        boolean valid = key.reset();        if (!valid) {          break;        }      }    } catch (IOException | InterruptedException ex) {      System.err.println(ex);    }  }

三、以上方法都可以實現對相應文件夾得文件監(jiān)控,但是在使用jdk7提供的API時,會出現些許問題。

  • (1)當文件修改時,會被調用兩次,即輸出兩個相同的修改。
  • (2)不能對其子文件夾進行監(jiān)控,只能提示目錄被修改。
  • (3)無法對文件類型進行過濾。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桐庐县| 长海县| 老河口市| 饶河县| 衡东县| 金阳县| 班戈县| 文安县| 依兰县| 佛坪县| 原阳县| 武陟县| 德阳市| 卢湾区| 灵寿县| 临朐县| 汕尾市| 隆林| 永春县| 区。| 东宁县| 余干县| 松溪县| 调兵山市| 藁城市| 宁河县| 孝昌县| 铜梁县| 当阳市| 大安市| 台湾省| 廉江市| 清徐县| 佛坪县| 清河县| 乐都县| 富源县| 彭水| 蒲江县| 武隆县| 鄢陵县|