当前位置:网站首页>Android cache usage tool class
Android cache usage tool class
2022-06-26 00:53:00 【App Hunter】
ACache: Android Cache string , Objects and other data
ACache One is for android To formulate the Lightweight Open source caching framework . Lightweight to just one java file ( It comes from a dozen classes ).
1、 It can cache something ?
Normal string 、json、 Serialized java object , and Byte number .
2、 What are its characteristics ?
The main features are :
1: light , It's as light as one JAVA file .
2: Configurable , You can configure the cache path , Cache size , Number of caches, etc .
3: You can set the cache timeout , Cache timeout is automatically invalidated , And deleted .
4: Multi process support .
The complete code is attached below :
public class ACache {
public static final int TIME_HOUR = 60 * 60;
public static final int TIME_DAY = TIME_HOUR * 24;
private static final int MAX_SIZE = 1000 * 1000 * 50; // 50 mb
private static final int MAX_COUNT = Integer.MAX_VALUE; // There is no limit to the amount of data stored
private static Map<String, ACache> mInstanceMap = new HashMap<String, ACache>();
private ACacheManager mCache;
public static ACache get(Context ctx) {
return get(ctx, "ACache");
}
public static ACache get(Context ctx, String cacheName) {
File f = new File(ctx.getCacheDir(), cacheName);
return get(f, MAX_SIZE, MAX_COUNT);
}
public static ACache get(File cacheDir) {
return get(cacheDir, MAX_SIZE, MAX_COUNT);
}
public static ACache get(Context ctx, long max_zise, int max_count) {
File f = new File(ctx.getCacheDir(), "ACache");
return get(f, max_zise, max_count);
}
public static ACache get(File cacheDir, long max_zise, int max_count) {
ACache manager = mInstanceMap.get(cacheDir.getAbsoluteFile() + myPid());
if (manager == null) {
manager = new ACache(cacheDir, max_zise, max_count);
mInstanceMap.put(cacheDir.getAbsolutePath() + myPid(), manager);
}
return manager;
}
private static String myPid() {
return "_" + android.os.Process.myPid();
}
private ACache(File cacheDir, long max_size, int max_count) {
if (!cacheDir.exists() && !cacheDir.mkdirs()) {
throw new RuntimeException("can't make dirs in "
+ cacheDir.getAbsolutePath());
}
mCache = new ACacheManager(cacheDir, max_size, max_count);
}
// =======================================
// ============ String data Reading and writing ==============
// =======================================
/**
* preservation String data To In cache
*
* @param key
* The saved key
* @param value
* The saved String data
*/
public void put(String key, String value) {
File file = mCache.newFile(key);
BufferedWriter out = null;
try {
out = new BufferedWriter(new FileWriter(file), 1024);
out.write(value);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
mCache.put(file);
}
}
/**
* preservation String data To In cache
*
* @param key
* The saved key
* @param value
* The saved String data
* @param saveTime
* Time of preservation , Company : second
*/
public void put(String key, String value, int saveTime) {
put(key, Utils.newStringWithDateInfo(saveTime, value));
}
/**
* Read String data
*
* @param key
* @return String data
*/
public String getAsString(String key) {
File file = mCache.get(key);
if (!file.exists())
return null;
boolean removeFile = false;
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(file));
String readString = "";
String currentLine;
while ((currentLine = in.readLine()) != null) {
readString += currentLine;
}
if (!Utils.isDue(readString)) {
return Utils.clearDateInfo(readString);
} else {
removeFile = true;
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (removeFile)
remove(key);
}
}
// =======================================
// ============= JSONObject data Reading and writing ==============
// =======================================
/**
* preservation JSONObject data To In cache
*
* @param key
* The saved key
* @param value
* The saved JSON data
*/
public void put(String key, JSONObject value) {
put(key, value.toString());
}
/**
* preservation JSONObject data To In cache
*
* @param key
* The saved key
* @param value
* The saved JSONObject data
* @param saveTime
* Time of preservation , Company : second
*/
public void put(String key, JSONObject value, int saveTime) {
put(key, value.toString(), saveTime);
}
/**
* Read JSONObject data
*
* @param key
* @return JSONObject data
*/
public JSONObject getAsJSONObject(String key) {
String JSONString = getAsString(key);
try {
JSONObject obj = new JSONObject(JSONString);
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// =======================================
// ============ JSONArray data Reading and writing =============
// =======================================
/**
* preservation JSONArray data To In cache
*
* @param key
* The saved key
* @param value
* The saved JSONArray data
*/
public void put(String key, JSONArray value) {
put(key, value.toString());
}
/**
* preservation JSONArray data To In cache
*
* @param key
* The saved key
* @param value
* The saved JSONArray data
* @param saveTime
* Time of preservation , Company : second
*/
public void put(String key, JSONArray value, int saveTime) {
put(key, value.toString(), saveTime);
}
/**
* Read JSONArray data
*
* @param key
* @return JSONArray data
*/
public JSONArray getAsJSONArray(String key) {
String JSONString = getAsString(key);
try {
JSONArray obj = new JSONArray(JSONString);
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// =======================================
// ============== byte data Reading and writing =============
// =======================================
/**
* preservation byte data To In cache
*
* @param key
* The saved key
* @param value
* Saved data
*/
public void put(String key, byte[] value) {
File file = mCache.newFile(key);
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
out.write(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
mCache.put(file);
}
}
/**
* preservation byte data To In cache
*
* @param key
* The saved key
* @param value
* Saved data
* @param saveTime
* Time of preservation , Company : second
*/
public void put(String key, byte[] value, int saveTime) {
put(key, Utils.newByteArrayWithDateInfo(saveTime, value));
}
/**
* obtain byte data
*
* @param key
* @return byte data
*/
public byte[] getAsBinary(String key) {
RandomAccessFile RAFile = null;
boolean removeFile = false;
try {
File file = mCache.get(key);
if (!file.exists())
return null;
RAFile = new RandomAccessFile(file, "r");
byte[] byteArray = new byte[(int) RAFile.length()];
RAFile.read(byteArray);
if (!Utils.isDue(byteArray)) {
return Utils.clearDateInfo(byteArray);
} else {
removeFile = true;
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (RAFile != null) {
try {
RAFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (removeFile)
remove(key);
}
}
// =======================================
// ============= serialize data Reading and writing ===============
// =======================================
/**
* preservation Serializable data To In cache
*
* @param key
* The saved key
* @param value
* The saved value
*/
public void put(String key, Serializable value) {
put(key, value, -1);
}
/**
* preservation Serializable Data to In cache
*
* @param key
* The saved key
* @param value
* The saved value
* @param saveTime
* Time of preservation , Company : second
*/
public void put(String key, Serializable value, int saveTime) {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(value);
byte[] data = baos.toByteArray();
if (saveTime != -1) {
put(key, data, saveTime);
} else {
put(key, data);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
}
}
}
/**
* Read Serializable data
*
* @param key
* @return Serializable data
*/
public Object getAsObject(String key) {
byte[] data = getAsBinary(key);
if (data != null) {
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
bais = new ByteArrayInputStream(data);
ois = new ObjectInputStream(bais);
Object reObject = ois.readObject();
return reObject;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (bais != null)
bais.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (ois != null)
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
// =======================================
// ============== bitmap data Reading and writing =============
// =======================================
/**
* preservation bitmap To In cache
*
* @param key
* The saved key
* @param value
* The saved bitmap data
*/
public void put(String key, Bitmap value) {
put(key, Utils.Bitmap2Bytes(value));
}
/**
* preservation bitmap To In cache
*
* @param key
* The saved key
* @param value
* The saved bitmap data
* @param saveTime
* Time of preservation , Company : second
*/
public void put(String key, Bitmap value, int saveTime) {
put(key, Utils.Bitmap2Bytes(value), saveTime);
}
/**
* Read bitmap data
*
* @param key
* @return bitmap data
*/
public Bitmap getAsBitmap(String key) {
if (getAsBinary(key) == null) {
return null;
}
return Utils.Bytes2Bimap(getAsBinary(key));
}
// =======================================
// ============= drawable data Reading and writing =============
// =======================================
/**
* preservation drawable To In cache
*
* @param key
* The saved key
* @param value
* The saved drawable data
*/
public void put(String key, Drawable value) {
put(key, Utils.drawable2Bitmap(value));
}
/**
* preservation drawable To In cache
*
* @param key
* The saved key
* @param value
* The saved drawable data
* @param saveTime
* Time of preservation , Company : second
*/
public void put(String key, Drawable value, int saveTime) {
put(key, Utils.drawable2Bitmap(value), saveTime);
}
/**
* Read Drawable data
*
* @param key
* @return Drawable data
*/
public Drawable getAsDrawable(String key) {
if (getAsBinary(key) == null) {
return null;
}
return Utils.bitmap2Drawable(Utils.Bytes2Bimap(getAsBinary(key)));
}
/**
* Get cache file
*
* @param key
* @return value Cached files
*/
public File file(String key) {
File f = mCache.newFile(key);
if (f.exists())
return f;
return null;
}
/**
* To remove a key
*
* @param key
* @return Removal successful
*/
public boolean remove(String key) {
return mCache.remove(key);
}
/**
* Clear all data
*/
public void clear() {
mCache.clear();
}
/**
* @title Cache manager
* @version 1.0
*/
public class ACacheManager {
private final AtomicLong cacheSize;
private final AtomicInteger cacheCount;
private final long sizeLimit;
private final int countLimit;
private final Map<File, Long> lastUsageDates = Collections
.synchronizedMap(new HashMap<File, Long>());
protected File cacheDir;
private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {
this.cacheDir = cacheDir;
this.sizeLimit = sizeLimit;
this.countLimit = countLimit;
cacheSize = new AtomicLong();
cacheCount = new AtomicInteger();
calculateCacheSizeAndCacheCount();
}
/**
* Calculation cacheSize and cacheCount
*/
private void calculateCacheSizeAndCacheCount() {
new Thread(new Runnable() {
@Override
public void run() {
int size = 0;
int count = 0;
File[] cachedFiles = cacheDir.listFiles();
if (cachedFiles != null) {
for (File cachedFile : cachedFiles) {
size += calculateSize(cachedFile);
count += 1;
lastUsageDates.put(cachedFile,
cachedFile.lastModified());
}
cacheSize.set(size);
cacheCount.set(count);
}
}
}).start();
}
private void put(File file) {
int curCacheCount = cacheCount.get();
while (curCacheCount + 1 > countLimit) {
long freedSize = removeNext();
cacheSize.addAndGet(-freedSize);
curCacheCount = cacheCount.addAndGet(-1);
}
cacheCount.addAndGet(1);
long valueSize = calculateSize(file);
long curCacheSize = cacheSize.get();
while (curCacheSize + valueSize > sizeLimit) {
long freedSize = removeNext();
curCacheSize = cacheSize.addAndGet(-freedSize);
}
cacheSize.addAndGet(valueSize);
Long currentTime = System.currentTimeMillis();
file.setLastModified(currentTime);
lastUsageDates.put(file, currentTime);
}
private File get(String key) {
File file = newFile(key);
Long currentTime = System.currentTimeMillis();
file.setLastModified(currentTime);
lastUsageDates.put(file, currentTime);
return file;
}
private File newFile(String key) {
return new File(cacheDir, key.hashCode() + "");
}
private boolean remove(String key) {
File image = get(key);
return image.delete();
}
private void clear() {
lastUsageDates.clear();
cacheSize.set(0);
File[] files = cacheDir.listFiles();
if (files != null) {
for (File f : files) {
f.delete();
}
}
}
/**
* Remove old files
*
* @return
*/
private long removeNext() {
if (lastUsageDates.isEmpty()) {
return 0;
}
Long oldestUsage = null;
File mostLongUsedFile = null;
Set<Entry<File, Long>> entries = lastUsageDates.entrySet();
synchronized (lastUsageDates) {
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();
}
}
}
}
long fileSize = calculateSize(mostLongUsedFile);
if (mostLongUsedFile.delete()) {
lastUsageDates.remove(mostLongUsedFile);
}
return fileSize;
}
private long calculateSize(File file) {
return file.length();
}
}
/**
* @title Time calculation tool class
* @version 1.0
*/
private static class Utils {
/**
* Determine the cache size String Whether the data is due
*
* @param str
* @return true: It's due false: It hasn't expired yet
*/
private static boolean isDue(String str) {
return isDue(str.getBytes());
}
/**
* Determine the cache size byte Whether the data is due
*
* @param data
* @return true: It's due false: It hasn't expired yet
*/
private static boolean isDue(byte[] data) {
String[] strs = getDateInfoFromDate(data);
if (strs != null && strs.length == 2) {
String saveTimeStr = strs[0];
while (saveTimeStr.startsWith("0")) {
saveTimeStr = saveTimeStr
.substring(1, saveTimeStr.length());
}
long saveTime = Long.valueOf(saveTimeStr);
long deleteAfter = Long.valueOf(strs[1]);
if (System.currentTimeMillis() > saveTime + deleteAfter * 1000) {
return true;
}
}
return false;
}
private static String newStringWithDateInfo(int second, String strInfo) {
return createDateInfo(second) + strInfo;
}
private static byte[] newByteArrayWithDateInfo(int second, byte[] data2) {
byte[] data1 = createDateInfo(second).getBytes();
byte[] retdata = new byte[data1.length + data2.length];
System.arraycopy(data1, 0, retdata, 0, data1.length);
System.arraycopy(data2, 0, retdata, data1.length, data2.length);
return retdata;
}
private static String clearDateInfo(String strInfo) {
if (strInfo != null && hasDateInfo(strInfo.getBytes())) {
strInfo = strInfo.substring(strInfo.indexOf(mSeparator) + 1,
strInfo.length());
}
return strInfo;
}
private static byte[] clearDateInfo(byte[] data) {
if (hasDateInfo(data)) {
return copyOfRange(data, indexOf(data, mSeparator) + 1,
data.length);
}
return data;
}
private static boolean hasDateInfo(byte[] data) {
return data != null && data.length > 15 && data[13] == '-'
&& indexOf(data, mSeparator) > 14;
}
private static String[] getDateInfoFromDate(byte[] data) {
if (hasDateInfo(data)) {
String saveDate = new String(copyOfRange(data, 0, 13));
String deleteAfter = new String(copyOfRange(data, 14,
indexOf(data, mSeparator)));
return new String[] { saveDate, deleteAfter };
}
return null;
}
private static int indexOf(byte[] data, char c) {
for (int i = 0; i < data.length; i++) {
if (data[i] == c) {
return i;
}
}
return -1;
}
private static byte[] copyOfRange(byte[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
byte[] copy = new byte[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
private static final char mSeparator = ' ';
private static String createDateInfo(int second) {
String currentTime = System.currentTimeMillis() + "";
while (currentTime.length() < 13) {
currentTime = "0" + currentTime;
}
return currentTime + "-" + second + mSeparator;
}
/*
* Bitmap → byte[]
*/
private static byte[] Bitmap2Bytes(Bitmap bm) {
if (bm == null) {
return null;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
/*
* byte[] → Bitmap
*/
private static Bitmap Bytes2Bimap(byte[] b) {
if (b.length == 0) {
return null;
}
return BitmapFactory.decodeByteArray(b, 0, b.length);
}
/*
* Drawable → Bitmap
*/
private static Bitmap drawable2Bitmap(Drawable drawable) {
if (drawable == null) {
return null;
}
// take drawable The length and width of
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
// take drawable The color format of
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
// Establish corresponding bitmap
Bitmap bitmap = Bitmap.createBitmap(w, h, config);
// Establish corresponding bitmap Canvas of
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
// hold drawable The content is drawn into the canvas
drawable.draw(canvas);
return bitmap;
}
/*
* Bitmap → Drawable
*/
@SuppressWarnings("deprecation")
private static Drawable bitmap2Drawable(Bitmap bm) {
if (bm == null) {
return null;
}
return new BitmapDrawable(bm);
}
}
}
Use :
Set cache data :
ACache mCache = ACache.get(this);
mCache.put("key1", "value");
// preservation 6 second , If exceeded 6 Seconds to get this key, Will be for null
mCache.put("key2", "value", 6);
// preservation 6 God , If exceeded 6 Days to get this key, Will be for null
mCache.put("key3", "value", 6 * ACache.TIME_DAY);
Get cached data :
ACache mCache = ACache.get(this);
String value = mCache.getAsString("key1");
Take a chestnut
Save the data
Acache aCache = ACache.get(this); // Fragment Li Wei getActivity()
aCache.put("key", "value");
Reading data : Determine whether the current cache is empty , If yes, it will not be read , Otherwise, read the data
Acache aCache;
if (aCache==null)
aCache = ACache.get(this);
String asString = aCache.getAsString("key");
边栏推荐
- Redis的安装及启动
- ADC acquisition noise and comparison between RMS filter and Kalman filter
- Implementation notes of least square fitting conic in stm32
- Run the test program using rknn-toolkit-lite2 for rk3568 development board
- Vscode shortcut
- Flink reports error: a JNI error has occurred, please check your installation and try again
- JS逆向案例:破解登录密码
- Final review [machine learning]
- 信号处理函数内必须使用可重入函数
- 渗透工具-Burpsuite
猜你喜欢
Comprehensive introduction to Simulink solver
1-11solutions to common problems of VMware virtual machine
"Method not allowed", 405 problem analysis and solution
Redisson 3.17.4 发布
"Seamless" deployment of paddlenlp model based on openvinotm development kit
案例:绘制Matplotlib动态图
统一网关Gateway
渗透工具-Burpsuite
关于HC-12无线射频模块使用
1-10Vmware构建自定义的网络架构
随机推荐
Redis的安装及启动
[image detection] vascular tracking and diameter estimation based on Gaussian process and Radon transform with matlab code
2021-04-28
ASP.NET cache缓存的用法
QT excellent open source project 9: qtox
【图像检测】基于高斯过程和Radon变换实现血管跟踪和直径估计附matlab代码
mtb13_Perform extract_blend_Super{Candidate(PrimaryAlternate)_Unique(可NULL过滤_Foreign_index_granulari
Openresty chapter 01 introduction and installation configuration
Dynamic verification code
How to design the product roadmap?
下载安装Flume
【TSP问题】基于Hopfield神经网络求解旅行商问题附Matlab代码
Implementation notes of least square fitting conic in stm32
使用VS2022编译Telegram桌面端(tdesktop)
Wireshark's analysis of IMAP packet capturing
What are the red lines of open source that should not be trodden on?
1-10vmware builds customized network architecture
继承--圣杯模式
Methods of modifying elements in JS array
Spark log analysis