簡體   English   中英

Java Max文件緩存解決方案

[英]Java max file caching solution

我試圖將許多文件寫入目錄,並且當目錄達到X個文件時,我希望在寫入新文件之前刪除最近訪問最少的文件。 我真的不想為此提出自己的解決方案,因為我想其他人以前已經做到了。 是否有解決方案? 請注意,這是針對Windows應用程序的。

這與我的問題Java ehcache磁盤存儲有關 ,但是因為我現在專注於文件緩存解決方案,所以我單獨詢問這個問題。

謝謝傑夫

我自己動手做,因為問題聽起來很簡單,以至於自己編寫它可能比嘗試學習並采用現有的庫容易:-)

文件數量少和/或從多個進程訪問您的現金,請在寫入文件之前調用以下方法:

void deleteOldFiles(String dir, long maxFileCount) {
    while (true) {
        File oldest = null;
        long oldestTime = 0;
        File[] list = new File(dir).listFiles();
        if (list.length < maxFileCount) {
            break;
        }
        for (File f : list) {
            long m = f.lastModified();
            if (oldest == null || oldestTime > m) {
                oldestTime = m;
                oldest = f;
            }
        }
        oldest.delete();
    }
}

如果僅從一個進程訪問緩存,則可以使用LinkedHashMapLinkedHashSet編寫效率更高的東西。

更新資料

檢查文件數,而不是總文件大小。

您可以在創建新文件之前嘗試以下操作:

void deleteOldFiles(String dir, int maxFiles) {
    File fdir = new File(dir);
    while (true) {
        // Check number of files. Also do nothing if maxFiles == 0
        File[] files = fdir.listFiles();
        if (maxFiles == 0 || files.length < maxFiles)
            break;

        // Delete oldest
        File oldest = files[0];
        for (int i = 1; i < files.length; i++) {
            if (files[i].lastModified() < oldest.lastModified()) {
                oldest = files[i];
            }
        }
        oldest.delete();
    }
}

但是,這對於大量文件而言並不高效。 在這種情況下,我將在目錄中保留文件列表,並按創建時間排序。

盡管所有這些都進入了“滾動我自己的類別” ...

如果您使用的是Cacheonix,則可以在收到有關LRU算法取消了緩存條目的通知時連接到緩存事件API並刪除文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM