package com.snda.mzang.tvtogether.server.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.Map; public class ResourceCache { private static class CacheItem { String key; byte[] value; } private static Map<String, SoftReference<CacheItem>> cache = new HashMap<String, SoftReference<CacheItem>>(); private static ReferenceQueue<CacheItem> queue = new ReferenceQueue<CacheItem>(); public static byte[] getResource(String resPath) { if (resPath.contains("..")) { return new byte[0]; } cleanUpCacheMap(); SoftReference<CacheItem> cacheItemRef = cache.get(resPath); if (cacheItemRef != null) { CacheItem cacheItem = cacheItemRef.get(); if (cacheItem != null) { return cacheItem.value; } } String resRealPath = SC.resBase + resPath; byte[] fileData = null; InputStream input = null; try { File dataFile = new File(resRealPath); input = new FileInputStream(dataFile); fileData = new byte[(int) dataFile.length()]; input.read(fileData); } catch (Exception ex) { ex.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { } } } CacheItem cacheItem = new CacheItem(); cacheItem.key = resPath; cacheItem.value = fileData; SoftReference<CacheItem> ref = new SoftReference<CacheItem>(cacheItem, queue); cache.put(resPath, ref); return fileData; } private static void cleanUpCacheMap() { Reference<? extends CacheItem> softItem = null; while ((softItem = queue.poll()) != null) { CacheItem item = softItem.get(); if (item != null) { cache.remove(item.key); } } } }