简单LRU算法实现缓存大小的限制策略
来源:互联网 发布:sql minus 但不去重 编辑:程序博客网 时间:2024/04/30 15:00
参考:Android-Universal-Image-Loader
private final Map<File, Long> mLastUsageDates = Collections.synchronizedMap(new HashMap<File, Long>());private final AtomicInteger mCacheSize;private final int SIZE_LIMIT = 10 * 1024 * 1024;{ mCacheSize = new AtomicInteger(); calculateCacheSizeAndFillUsageMap();}{ saveImage(name); putImage(name);} private void calculateCacheSizeAndFillUsageMap() { new Thread(new Runnable() {@Overridepublic void run() {int size = 0;File imageDir = new File(DIR_IMAGE);File[] cachedFiles = imageDir.listFiles();if(cachedFiles != null){for(File cachedFile : cachedFiles){size += cachedFile.length();mLastUsageDates.put(cachedFile, cachedFile.lastModified());}mCacheSize.set(size);}}}).start(); } private void putImage(String path){ if(path == null) return; File imageFile = new File(path); if(!imageFile.exists()) return; int valueSize = (int)imageFile.length(); int curCacheSize = mCacheSize.get(); while (curCacheSize + valueSize > SIZE_LIMIT) { int freedSize = removeMostLongUsedFile(); if (freedSize == -1) break; curCacheSize = mCacheSize.addAndGet(-freedSize); } mCacheSize.addAndGet(valueSize); mLastUsageDates.put(imageFile, imageFile.lastModified()); } private int removeMostLongUsedFile(){if (mLastUsageDates.isEmpty()) {return -1;}Long oldestUsage = null;File mostLongUsedFile = null;Set<Entry<File, Long>> entries = mLastUsageDates.entrySet();synchronized (mLastUsageDates) {for (Entry<File, Long> entry : entries) {if (mostLongUsedFile == null) {mostLongUsedFile = entry.getKey();oldestUsage = entry.getValue();} else {Long lastValueUsage = entry.getValue();if (lastValueUsage < oldestUsage) {oldestUsage = lastValueUsage;mostLongUsedFile = entry.getKey();}}}}int fileSize = 0;if (mostLongUsedFile != null) {if (mostLongUsedFile.exists()) {fileSize = (int)mostLongUsedFile.length();if (mostLongUsedFile.delete()) {mLastUsageDates.remove(mostLongUsedFile);}} else {mLastUsageDates.remove(mostLongUsedFile);}}return fileSize; }
0 0
- 简单LRU算法实现缓存大小的限制策略
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 利用LinkedHashMap简单实现基于LRU策略的缓存
- Lru缓存的简单实现
- 简单的LRU缓存实现
- 【链表】实现LRU缓存策略LRU Cache
- LRU缓存算法实现
- LinkedHashMap实现简单的LRU缓存
- 哈希链表实现的LRU缓存算法
- LRU缓存的实现算法讨论
- 基于LRU算法的缓存实现
- LinkedList实现基于LRU算法的缓存
- LRU缓存-java简单实现
- 缓存中实现LRU算法
- LRU缓存算法Java实现
- 编程之美 2.5 寻找最大的K个数
- Android内存性能优化
- netcdf文件介绍以及IDL读取
- 算法研发----千里之行始于足下
- dbus的数据类型
- 简单LRU算法实现缓存大小的限制策略
- maven使用Nexus私有仓库进行管理
- matlab统计学分析函数
- Android从入门到精通第12章:线程与消息处理
- Raspberry pi,一个好玩的派:第一季 开源硬件
- SQL Case when 的使用方法
- cannot find class [xxx] for bean with name
- javascript扩展date对象格式化日期时间输出
- 颜色渐变实用获取色值方法