欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)文件監(jiān)控器FileMonitor的實例代碼

 更新時間:2019年12月24日 08:30:08   作者:IT_熊  
這篇文章主要介紹了Java實現(xiàn)文件監(jiān)控器FileMonitor的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

應(yīng)用場景:

代碼可以實現(xiàn)文件變化后的監(jiān)聽,如文件變化,自動重新加載文件內(nèi)容,實現(xiàn)配置文件的熱部署。

代碼: 

package com.yx.demo.filemonitor;
 
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
 
/**
 * FileMonitor
 * 文件監(jiān)控器
 *
 * @author yx
 * @date 2019/12/21 0:59
 */
public class FileMonitor {
 
  /**
   * 每2秒更新的默認監(jiān)控器
   */
  private static FileMonitor defaultFileMonitor = new FileMonitor(2 * 1000);
 
  private Timer timer_;
  private HashMap<File, FileEntry> files_; // File -> Long
  private List<FileEntry> fileEntrys = new java.util.concurrent.CopyOnWriteArrayList<FileEntry>();
  private Collection<WeakReference<FileListener>> listeners_; // of WeakReference(FileListener)
 
  private long pollingInterval = 10000;
 
  public static FileMonitor getDefaultFileMonitor() {
    return defaultFileMonitor;
  }
 
  /**
   * Create a file monitor instance with specified polling interval.
   *
   * @param pollingInterval Polling interval in milli seconds.
   */
  public FileMonitor(long pollingInterval) {
    this.pollingInterval = pollingInterval;
 
    files_ = new HashMap<File, FileEntry>();
    listeners_ = new ArrayList<WeakReference<FileListener>>();
 
    timer_ = new Timer("FileMonitor", true);
    timer_.schedule(new FileMonitorNotifier(), 0, pollingInterval);
  }
 
  /**
   * Stop the file monitor polling.
   */
  public void stop() {
    timer_.cancel();
    timer_ = null;
  }
 
  public void start() {
    if (timer_ == null) {
      timer_ = new Timer(true);
      timer_.schedule(new FileMonitorNotifier(), 0, pollingInterval);
    }
  }
 
  /**
   * Add file to listen for. File may be any java.io.File (including a
   * directory) and may well be a non-existing file in the case where the
   * creating of the file is to be trepped.
   * <p>
   * More than one file can be listened for. When the specified file is
   * created, modified or deleted, listeners are notified.
   *
   * @param file File to listen for.
   */
  public void addFile(String id, File file) {
    if (!files_.containsKey(file)) {
 
      FileEntry entry = new FileEntry(id, file, file.exists() ? file.lastModified() : -1);
      files_.put(file, entry);
    }
  }
 
  /**
   * 添加監(jiān)控文件實體。
   *
   * @param fileEntry
   */
  public void addFileEntry(FileEntry fileEntry) {
    if (!fileEntrys.contains(fileEntry)) {
      fileEntrys.add(fileEntry);
    }
  }
 
  /**
   * 通過文件實體的標(biāo)識判斷監(jiān)控文件實體是否存在。
   *
   * @param id
   * @return
   */
  public boolean fileEntryExists(String id) {
    if (id == null) {
      return false;
    }
 
    for (int i = 0; i < fileEntrys.size(); i++) {
      if (id.equals(fileEntrys.get(i).getId())) {
        return true;
      }
    }
 
    return false;
  }
 
  /**
   * 通過文件實體標(biāo)識刪除一個監(jiān)控文件實體。
   *
   * @param id
   */
  public void removeFileEntry(String id) {
    if (id == null) {
      return;
    }
 
    for (int i = 0; i < fileEntrys.size(); i++) {
      if (id.equals(fileEntrys.get(i).getId())) {
        fileEntrys.remove(i);
        return;
      }
    }
  }
 
  /**
   * Remove specified file for listening.
   *
   * @param file File to remove.
   */
  public void removeFile(File file) {
    files_.remove(file);
  }
 
  /**
   * Add listener to this file monitor.
   *
   * @param fileListener Listener to add.
   */
  public void addListener(FileListener fileListener) {
    // Don't add if its already there
    for (Iterator<WeakReference<FileListener>> i = listeners_.iterator(); i.hasNext(); ) {
      WeakReference<FileListener> reference = i.next();
      FileListener listener = (FileListener) reference.get();
      if (listener == fileListener) {
        return;
      }
    }
 
    // Use WeakReference to avoid memory leak if this becomes the
    // sole reference to the object.
    listeners_.add(new WeakReference<FileListener>(fileListener));
  }
 
  /**
   * Remove listener from this file monitor.
   *
   * @param fileListener Listener to remove.
   */
  public void removeListener(FileListener fileListener) {
    for (Iterator<WeakReference<FileListener>> i = listeners_.iterator(); i.hasNext(); ) {
      WeakReference<FileListener> reference = (WeakReference<FileListener>) i.next();
      FileListener listener = (FileListener) reference.get();
      if (listener == fileListener) {
        i.remove();
        break;
      }
    }
  }
 
  /**
   * This is the timer thread which is executed every n milliseconds according
   * to the setting of the file monitor. It investigates the file in question
   * and notify listeners if changed.
   */
  private class FileMonitorNotifier extends TimerTask {
    @Override
    public void run() {
      try {
        for (Iterator<FileEntry> i = fileEntrys.iterator(); i.hasNext(); ) {
          try {
            FileEntry entry = i.next();
            if (entry == null || !entry.check()) {
              i.remove();
            }
          } catch (Throwable t) {
            t.printStackTrace();
            System.out.println("執(zhí)行文件監(jiān)控發(fā)生錯誤:" + t.getMessage());
          }
        }
 
        // Loop over the registered files and see which have changed.
        // Use a copy of the list in case listener wants to alter the
        // list within its fileChanged method.
        Collection<File> files = new ArrayList<File>(files_.keySet());
 
        for (Iterator<File> i = files.iterator(); i.hasNext(); ) {
          File file = i.next();
          try {
            FileEntry fileEntry = files_.get(file);
            long lastModifiedTime = fileEntry.getLastModified();
            long newModifiedTime = file.exists() ? file.lastModified() : -1;
 
            //logger.debug(file.getAbsolutePath());
            //logger.debug("  {}=>{}", lastModifiedTime, newModifiedTime);
            // Chek if file has changed
            if (newModifiedTime != lastModifiedTime) {
              //logger.debug("file changed {})", file.getAbsolutePath());
              fileEntry.setLastModified(newModifiedTime);
              // Register new modified time
              files_.put(file, fileEntry);
 
              if (fileEntry.getFileListener() != null) {
                fileEntry.getFileListener().fileChanged(fileEntry);
              } else {
                // Notify listeners
                for (Iterator<WeakReference<FileListener>> j =
                    listeners_.iterator(); j.hasNext(); ) {
                  WeakReference<FileListener> reference =
                      (WeakReference<FileListener>) j.next();
                  FileListener listener = (FileListener) reference.get();
 
                  // Remove from list if the back-end object has been GC'd
                  if (listener == null) {
                    j.remove();
                  } else {
                    listener.fileChanged(fileEntry);
                  }
                }
              }
            }
          } catch (Throwable t) {
            if (file != null) {
              t.printStackTrace();
              System.out.println(
                  "file monitor execute error, file=" + file.getAbsolutePath() +
                      t.getMessage());
            } else {
              System.out.println(
                  "file monitor execute error, file=null" + t.getMessage());
            }
          }
        }
      } catch (Throwable t) {
        System.out.println("執(zhí)行文件監(jiān)控發(fā)生錯誤" + t.getMessage());
      }
    }
  }
}
package com.yx.demo.filemonitor;
 
/**
 * FileListener
 *
 * @author yx
 * @date 2019/12/21 0:55
 */
public interface FileListener {
 /**
 * 
 * @param fileEntry
 */
 public void fileChanged(FileEntry fileEntry);
}

package com.yx.demo.filemonitor; 

import java.io.File;
import java.lang.ref.WeakReference;
/**
 * FileEntry
 * 文件Entry,如果FileEntry指定了FileListener,那么當(dāng)文件發(fā)生變動時只觸發(fā)指定的FileListener
 *
 * @author yx
 * @date 2019/12/21 0:56
 */
public class FileEntry {
  String id;
  File file;
  long lastModified;
  FileListener fileListener = null;
  Object userData;
  WeakReference<Object> reference = null;
  /**
   * 構(gòu)造函數(shù)。
   *
   * @param id
   * @param file
   */
  public FileEntry(String id, File file) {
    this(id, file, file.exists() ? file.lastModified() : -1);
  }
  public FileEntry(Object reference, String id, File file) {
    this(id, file, file.exists() ? file.lastModified() : -1);
    reference = new WeakReference<Object>(reference);
  }
  /**
   * 構(gòu)造函數(shù)。
   *
   * @param id      標(biāo)識
   * @param file     要監(jiān)控的文件
   * @param lastmodified 最后修改日期
   */
  public FileEntry(String id, File file, long lastmodified) {
    super();
    this.id = id;
    this.file = file;
    this.lastModified = lastmodified;
  }
  public boolean check() {
    if (reference != null && reference.get() == null) {
      //監(jiān)控對象已經(jīng)不存在,請求FileMonitor刪除自己
      return false;
    }
    long newModifiedTime = file.exists() ? file.lastModified() : -1;
    if (lastModified != newModifiedTime) {
      this.lastModified = newModifiedTime;
      FileListener ls = this.getFileListener();
      if (ls == null) {
        return false;
      } else {
        try {
          ls.fileChanged(this);
        } catch (Exception e) {
          e.printStackTrace();
          System.err.println("執(zhí)行文件監(jiān)控事件監(jiān)聽" + e.getMessage());
        }
        return true;
      }
    } else {
      return true;
    }
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public File getFile() {
    return file;
  }
  public void setFile(File file) {
    this.file = file;
  }
  public long getLastModified() {
    return lastModified;
  }
  public void setLastModified(long lastModified) {
    this.lastModified = lastModified;
  }
  public FileListener getFileListener() {
    return fileListener;
  }
  public void setFileListener(FileListener fileListener) {
    this.fileListener = fileListener;
  }
  public Object getUserData() {
    return userData;
  }
  public void setUserData(Object userData) {
    this.userData = userData;
  }
}

使用demo:

// 文件路徑
String fileName = "conf/database.xml";
// 文件監(jiān)控
FileListener fileListener = new FileListener() {
@Override
public void fileChanged(FileEntry fileEntry) {
// TODO 文件變化后的業(yè)務(wù)處理
}
};
File file = new File(fileName);
FileEntry fileEntry = new FileEntry("database", file);
// 設(shè)置文件監(jiān)控
fileEntry.setFileListener(fileListener);
FileMonitor.getDefaultFileMonitor().addFileEntry(fileEntry);

總結(jié)

以上所述是小編給大家介紹的Java實現(xiàn)文件監(jiān)控器FileMonitor的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Java指令重排序在多線程環(huán)境下的處理方法

    Java指令重排序在多線程環(huán)境下的處理方法

    指令重排在單線程環(huán)境下有利于提高程序的執(zhí)行效率,不會對程序產(chǎn)生負面影響,本文對多線程指令重排問題進行復(fù)原,并針對指令重排給出相應(yīng)的解決方案,需要的朋友參考下吧
    2022-04-04
  • Spring聲明式事務(wù)@Transactional知識點分享

    Spring聲明式事務(wù)@Transactional知識點分享

    在本篇文章里小編給大家整理了關(guān)于Spring聲明式事務(wù)@Transactional詳解內(nèi)容,需要的朋友們可以參考下。
    2020-02-02
  • 解決springcloud-eureka注冊時的ip問題

    解決springcloud-eureka注冊時的ip問題

    這篇文章主要介紹了解決springcloud-eureka注冊時的ip問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 分享幾個Java工作中實用的代碼優(yōu)化技巧

    分享幾個Java工作中實用的代碼優(yōu)化技巧

    這篇文章主要給大家分享幾個Java工作中實用代碼優(yōu)化技巧,文章基于Java的相關(guān)資料展開對其優(yōu)化技巧的分享,需要的小伙伴可以參考一下
    2022-04-04
  • Elasticsearch配置文件示例示范

    Elasticsearch配置文件示例示范

    這篇文章主要為大家介紹了Elasticsearch配置文件的示例示范,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • SpringBoot3文件管理操作方法

    SpringBoot3文件管理操作方法

    這篇文章主要介紹了SpringBoot3文件管理,本文案例只圍繞普通文件和Excel兩種類型進行代碼實現(xiàn),包括工程搭建、上傳下載操作,需要的朋友可以參考下
    2023-08-08
  • springboot+vue?若依項目在windows2008R2企業(yè)版部署流程分析

    springboot+vue?若依項目在windows2008R2企業(yè)版部署流程分析

    這篇文章主要介紹了springboot+vue?若依項目在windows2008R2企業(yè)版部署流程,本次使用jar包啟動后端,故而準(zhǔn)備打包后的jar文件,需要的朋友可以參考下
    2022-12-12
  • Java后端WebSocket的Tomcat實現(xiàn)

    Java后端WebSocket的Tomcat實現(xiàn)

    這篇文章主要介紹了Java后端WebSocket的Tomcat實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java這個名字的來歷與優(yōu)勢

    Java這個名字的來歷與優(yōu)勢

    Java是Sun公司開發(fā)的一種編程語言,Sun公司最初的方向是讓Java來開發(fā)一些電器裝置程序,Java名字的由來,實際上是一個有趣的故事。
    2014-10-10
  • Java隱藏特性之雙括號初始化詳解

    Java隱藏特性之雙括號初始化詳解

    Java?語言擁有許多隱藏而強大的特性,其中之一是雙括號初始化,這篇文章將詳細介紹雙括號初始化的概念、用法和示例代碼,希望對大家有所幫助
    2023-12-12

最新評論