java實現監控文件變化


前言

監控文件的創建,修改和刪除

實現

使用java內置的WatchService

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.concurrent.TimeUnit;

public class WatchServiceTest {

  public static void main(String[] args) throws IOException, InterruptedException {
    WatchService service = FileSystems.getDefault().newWatchService();
    Path path = Paths.get("D:\\java\\decompile").toAbsolutePath();
    path.register(service,
        StandardWatchEventKinds.ENTRY_MODIFY,
        StandardWatchEventKinds.ENTRY_CREATE,
        StandardWatchEventKinds.ENTRY_DELETE);
    while (true) {
      WatchKey key = service.poll(3, TimeUnit.SECONDS);
      if (key == null) {
        continue;
      }
      for (WatchEvent<?> event : key.pollEvents()) {
        Kind<?> kind = event.kind();
        Path context = (Path) event.context();
        System.out.printf("Event %s has happened,which fileName is %s%n", kind.name(), context);
      }
      key.reset();
    }
  }
}

監控decompile文件夾,當文件夾內有新文件創建,文件修改或文件刪除時,會有事件通知,文件重命名會有刪除和創建兩種事件通知。監控文件夾名稱修改不會觸發通知。

使用apache的commons-io

maven依賴

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.8.0</version>
</dependency>

創建一個文件監聽器

import java.io.File;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;

public class FileListener implements FileAlterationListener {

  @Override
  public void onStart(FileAlterationObserver observer) {
//    System.out.println("onDirectoryCreate: " + observer.getDirectory());
  }

  @Override
  public void onDirectoryCreate(File directory) {
    System.out.println("onDirectoryCreate: " + directory);
  }

  @Override
  public void onDirectoryChange(File directory) {
    System.out.println("onDirectoryChange: " + directory);
  }

  @Override
  public void onDirectoryDelete(File directory) {
    System.out.println("onDirectoryDelete: " + directory);
  }

  @Override
  public void onFileCreate(File file) {
    System.out.println("onFileCreate: " + file);
  }

  @Override
  public void onFileChange(File file) {
    System.out.println("onFileChange: " + file);
  }

  @Override
  public void onFileDelete(File file) {
    System.out.println("onFileDelete: " + file);
  }

  @Override
  public void onStop(FileAlterationObserver observer) {
//    System.out.println("onStop: " + observer.getDirectory());
  }

}

主程序

import java.io.File;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

public class FileListenerTest {

  public static void main(String[] args) throws Exception {
    // 監控目錄
    String rootDir = "D:\\java\\decompile";
    // 輪詢間隔 1 秒
    long interval = TimeUnit.SECONDS.toMillis(1);
    // 創建過濾器
    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);
    //添加文件監聽器
    observer.addListener(new FileListener());
    //創建文件變化監聽器
    FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
    // 開始監控
    monitor.start();
  }

}

一個文件可以有多個監聽器,可以同時監控多個文件。FileAlterationMonitor 啟動一個新的線程每次間隔1秒,掃描所有過濾后的文件和文件夾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM