首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 監測文件修改時間的三種實現方案

     編輯:Java 相關知識

概述

在需要熱加載配置、插件或緩存失效的場景下,監測文件最後修改時間是基礎需求。本文總結三種典型技術路線。

1. 定時器輪詢

使用 java.util.Timer 定期檢查 file.lastModified()。

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    long last = 0;
    @Override
    public void run() {
        long cur = file.lastModified();
        if (cur > last) {
            last = cur;
            reload(); // 觸發重新加載
        }
    }
}, 0, 5000); // 每 5 秒檢查一次

簡單但精度受限於輪詢間隔;異常會殺死 Timer。

2. 自定義類加載器熱加載

核心類 ManageClassLoader 維護 lastModified,讀取文件字節碼,通過 DynamicClassLoader.defineClass 重新定義類。

public Class<?> loadClass(String name) throws Exception {
    if (isClassModified(name)) {
        dc = new DynamicClassLoader();
        return c = dc.findClass(getBytes(name));
    }
    return c;
}
private boolean isClassModified(String filename) {
    File file = new File(filename);
    if (file.lastModified() > lastModified) {
        lastModified = file.lastModified();
        return true;
    }
    return false;
}

適用於 .class 文件熱替換,注意類身份問題(同名類不同加載器視為不同類型)。

3. 獨立監聽線程

new Thread(() -> {
    long last = 0;
    while (!Thread.interrupted()) {
        long cur = file.lastModified();
        if (cur > last) {
            last = cur;
            onChange();
        }
        try { Thread.sleep(1000); } catch (InterruptedException e) { break; }
    }
}).start();

靈活可控,支持優雅關閉(中斷線程),易於整合回調或事件總線。

生產環境建議

  • 優先使用成熟庫:Apache Commons IO 的 FileAlterationMonitor、WatchService (JDK 7+) 基於操作系統原生通知(Linux inotify, Windows ReadDirectoryChangesW),無輪詢開銷,實時性最佳。
  • 若項目依賴 Spring,可用 FileSystemXmlApplicationContext 的 refresh() 或 Spring Boot DevTools 熱重載。

總結對比

方案實時性跨平台複雜度備註
Timer/線程輪詢間隔內是低簡單場景
自定義類加載器即時是高類熱替換專用
WatchService (NIO.2)即時大多數中推薦生產環境
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved