Javaはリアルタイムでディレクトリの下でファイルの変化を監視する方法を実現します。


一、commons-iの方法
1、Commons-monoのmonitorを使って関連している種類を処理してファイルを監視することができます。観察者モードを採用して実現しました。
  • (1)フォルダの作成、削除、修正を監視することができます。
  • (2)ファイルの作成、削除、修正を監視することができる
  • (3)は観察者モードで実現される
  • を採用する。
  • (4)スレッドを用いて、検出ファイルの変更状況をタイムアウトして更新する

  • 2、commons-iバッグを導入するには、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、FileAlteration ListenerAdaptorを継承するクラスFileListenerを作成します。
    
    import java.io.File;
    import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
    import org.apache.commons.io.monitor.FileAlterationObserver;
    import org.apache.log4j.Logger;
    /**
     *        
     *  Apache Commons-IO              .          :
     *       FileAlterationMonitor              FileAlterationObserver,
     *         ,           ,       ,    ,    。(   1000        )
     */
    public class FileListener extends FileAlterationListenerAdaptor {
      private Logger log = Logger.getLogger(FileListener.class);
      /**
       *       
       */
      public void onFileCreate(File file) {
        log.info("[  ]:" + file.getAbsolutePath());
      }
      /**
       *       
       */
      public void onFileChange(File file) {
        log.info("[  ]:" + file.getAbsolutePath());
      }
      /**
       *     
       */
      public void onFileDelete(File file) {
        log.info("[  ]:" + file.getAbsolutePath());
      }
      /**
       *     
       */
      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、メーン方法を実現する
    
    public static void main(String[] args) throws Exception{
        //     
        String rootDir = "D:\\apache-tomcat-7.0.78";
        //      5  
        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);
        //      
        //FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
        observer.addListener(new FileListener());
        //         
        FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
        //     
        monitor.start();
      }
    二、JDK 7を使って提供されるWatch Service
    
    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;
              }
              //    
              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);
        }
      }
    三、以上の方法はすべて対応するフォルダに対するファイル監視を実現することができますが、jdk 7が提供するAPIを使用すると、少し問題があります。
  • (1)ファイルを変更すると、2回呼び出しられます。すなわち、同じ修正を2つ出力します。
  • (2)そのサブフォルダを監視することができません。ディレクトリが変更されることを示すしかありません。
  • (3)ファイルタイプをフィルタリングできません。
  • 締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。