Created
December 24, 2018 12:47
-
-
Save guffyWave/5f36094fe852cfccf368fd56e1088f2d to your computer and use it in GitHub Desktop.
DiskLruCacheHelper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Taken from | |
https://www.programcreek.com/java-api-examples/?code=lujianzhao/AndroidBase/AndroidBase-master/AndroidBase/src/main/java/com/ljz/base/common/diskcache/DiskLruCacheHelper.java# | |
import android.content.Context; | |
import android.graphics.Bitmap; | |
import android.graphics.drawable.Drawable; | |
import android.os.Environment; | |
import android.util.Log; | |
import com.jakewharton.disklrucache.DiskLruCache; | |
import org.json.JSONArray; | |
import org.json.JSONException; | |
import org.json.JSONObject; | |
import java.io.BufferedWriter; | |
import java.io.ByteArrayOutputStream; | |
import java.io.File; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.io.ObjectInputStream; | |
import java.io.ObjectOutputStream; | |
import java.io.OutputStream; | |
import java.io.OutputStreamWriter; | |
import java.io.Serializable; | |
/** | |
* Created by zhy on 15/7/28. | |
*/ | |
public class DiskLruCacheHelper { | |
private static final String DIR_NAME = "diskCache"; | |
private static final int MAX_COUNT = 5 * 1024 * 1024; | |
private static final int DEFAULT_APP_VERSION = 1; | |
/** | |
* The default valueCount when open DiskLruCache. | |
*/ | |
private static final int DEFAULT_VALUE_COUNT = 1; | |
private static final String TAG = "DiskLruCacheHelper"; | |
private DiskLruCache mDiskLruCache; | |
public DiskLruCacheHelper(Context context) throws IOException { | |
mDiskLruCache = generateCache(context, DIR_NAME, MAX_COUNT); | |
} | |
public DiskLruCacheHelper(Context context, String dirName) throws IOException { | |
mDiskLruCache = generateCache(context, dirName, MAX_COUNT); | |
} | |
public DiskLruCacheHelper(Context context, String dirName, int maxCount) throws IOException { | |
mDiskLruCache = generateCache(context, dirName, maxCount); | |
} | |
//custom cache dir | |
public DiskLruCacheHelper(File dir) throws IOException { | |
mDiskLruCache = generateCache(null, dir, MAX_COUNT); | |
} | |
public DiskLruCacheHelper(Context context, File dir) throws IOException { | |
mDiskLruCache = generateCache(context, dir, MAX_COUNT); | |
} | |
public DiskLruCacheHelper(Context context, File dir, int maxCount) throws IOException { | |
mDiskLruCache = generateCache(context, dir, maxCount); | |
} | |
private DiskLruCache generateCache(Context context, File dir, int maxCount) throws IOException { | |
if (!dir.exists() || !dir.isDirectory()) { | |
throw new IllegalArgumentException( | |
dir + " is not a directory or does not exists. "); | |
} | |
int appVersion = context == null ? DEFAULT_APP_VERSION : Utils.getAppVersion(context); | |
DiskLruCache diskLruCache = DiskLruCache.open( | |
dir, | |
appVersion, | |
DEFAULT_VALUE_COUNT, | |
maxCount); | |
return diskLruCache; | |
} | |
private DiskLruCache generateCache(Context context, String dirName, int maxCount) throws IOException { | |
DiskLruCache diskLruCache = DiskLruCache.open( | |
getDiskCacheDir(context, dirName), | |
Utils.getAppVersion(context), | |
DEFAULT_VALUE_COUNT, | |
maxCount); | |
return diskLruCache; | |
} | |
// ======================================= | |
// ============== String 数据 读写 ============= | |
// ======================================= | |
public void put(String key, String value) { | |
DiskLruCache.Editor edit = null; | |
BufferedWriter bw = null; | |
try { | |
edit = editor(key); | |
if (edit == null) return; | |
OutputStream os = edit.newOutputStream(0); | |
bw = new BufferedWriter(new OutputStreamWriter(os)); | |
bw.write(value); | |
edit.commit();//write CLEAN | |
} catch (IOException e) { | |
e.printStackTrace(); | |
try { | |
//s | |
edit.abort();//write REMOVE | |
} catch (IOException e1) { | |
e1.printStackTrace(); | |
} | |
} finally { | |
try { | |
if (bw != null) | |
bw.close(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
public String getAsString(String key) { | |
InputStream inputStream = null; | |
inputStream = get(key); | |
if (inputStream == null) return null; | |
String str = null; | |
try { | |
str = Utils.readFully(new InputStreamReader(inputStream, Utils.UTF_8)); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
try { | |
inputStream.close(); | |
} catch (IOException e1) { | |
e1.printStackTrace(); | |
} | |
} | |
return str; | |
} | |
public void put(String key, JSONObject jsonObject) { | |
put(key, jsonObject.toString()); | |
} | |
public JSONObject getAsJson(String key) { | |
String val = getAsString(key); | |
try { | |
if (val != null) | |
return new JSONObject(val); | |
} catch (JSONException e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
// ======================================= | |
// ============ JSONArray 数据 读写 ============= | |
// ======================================= | |
public void put(String key, JSONArray jsonArray) { | |
put(key, jsonArray.toString()); | |
} | |
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 数据 读写 ============= | |
// ======================================= | |
/** | |
* 保存 byte数据 到 缓存中 | |
* | |
* @param key 保存的key | |
* @param value 保存的数据 | |
*/ | |
public void put(String key, byte[] value) { | |
OutputStream out = null; | |
DiskLruCache.Editor editor = null; | |
try { | |
editor = editor(key); | |
if (editor == null) { | |
return; | |
} | |
out = editor.newOutputStream(0); | |
out.write(value); | |
out.flush(); | |
editor.commit();//write CLEAN | |
} catch (Exception e) { | |
e.printStackTrace(); | |
try { | |
editor.abort();//write REMOVE | |
} catch (IOException e1) { | |
e1.printStackTrace(); | |
} | |
} finally { | |
if (out != null) { | |
try { | |
out.close(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
public byte[] getAsBytes(String key) { | |
byte[] res = null; | |
InputStream is = get(key); | |
if (is == null) return null; | |
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |
try { | |
byte[] buf = new byte[256]; | |
int len = 0; | |
while ((len = is.read(buf)) != -1) { | |
baos.write(buf, 0, len); | |
} | |
res = baos.toByteArray(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return res; | |
} | |
// ======================================= | |
// ============== 序列化 数据 读写 ============= | |
// ======================================= | |
public void put(String key, Serializable value) { | |
DiskLruCache.Editor editor = editor(key); | |
ObjectOutputStream oos = null; | |
if (editor == null) return; | |
try { | |
OutputStream os = editor.newOutputStream(0); | |
oos = new ObjectOutputStream(os); | |
oos.writeObject(value); | |
oos.flush(); | |
editor.commit(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
try { | |
editor.abort(); | |
} catch (IOException e1) { | |
e1.printStackTrace(); | |
} | |
} finally { | |
try { | |
if (oos != null) | |
oos.close(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
public <T> T getAsSerializable(String key) { | |
T t = null; | |
InputStream is = get(key); | |
ObjectInputStream ois = null; | |
if (is == null) return null; | |
try { | |
ois = new ObjectInputStream(is); | |
t = (T) ois.readObject(); | |
} catch (ClassNotFoundException | IOException e) { | |
e.printStackTrace(); | |
} finally { | |
try { | |
if (ois != null) | |
ois.close(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
return t; | |
} | |
// ======================================= | |
// ============== bitmap 数据 读写 ============= | |
// ======================================= | |
public void put(String key, Bitmap bitmap) { | |
put(key, Utils.bitmap2Bytes(bitmap)); | |
} | |
public Bitmap getAsBitmap(String key) { | |
byte[] bytes = getAsBytes(key); | |
if (bytes == null) return null; | |
return Utils.bytes2Bitmap(bytes); | |
} | |
// ======================================= | |
// ============= drawable 数据 读写 ============= | |
// ======================================= | |
public void put(String key, Drawable value) { | |
put(key, Utils.drawable2Bitmap(value)); | |
} | |
public Drawable getAsDrawable(String key) { | |
byte[] bytes = getAsBytes(key); | |
if (bytes == null) { | |
return null; | |
} | |
return Utils.bitmap2Drawable(Utils.bytes2Bitmap(bytes)); | |
} | |
// ======================================= | |
// ============= other methods ============= | |
// ======================================= | |
public boolean remove(String key) { | |
try { | |
key = Utils.hashKeyForDisk(key); | |
return mDiskLruCache.remove(key); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return false; | |
} | |
public void close() throws IOException { | |
mDiskLruCache.close(); | |
} | |
public void delete() throws IOException { | |
mDiskLruCache.delete(); | |
} | |
public void flush() throws IOException { | |
mDiskLruCache.flush(); | |
} | |
public boolean isClosed() { | |
return mDiskLruCache.isClosed(); | |
} | |
public long size() { | |
return mDiskLruCache.size(); | |
} | |
public void setMaxSize(long maxSize) { | |
mDiskLruCache.setMaxSize(maxSize); | |
} | |
public File getDirectory() { | |
return mDiskLruCache.getDirectory(); | |
} | |
public long getMaxSize() { | |
return mDiskLruCache.getMaxSize(); | |
} | |
// ======================================= | |
// ===遇到文件比较大的,可以直接通过流读写 ===== | |
// ======================================= | |
//basic editor | |
public DiskLruCache.Editor editor(String key) { | |
try { | |
key = Utils.hashKeyForDisk(key); | |
//wirte DIRTY | |
DiskLruCache.Editor edit = mDiskLruCache.edit(key); | |
//edit maybe null :the entry is editing | |
if (edit == null) { | |
Log.w(TAG, "the entry spcified key:" + key + " is editing by other . "); | |
} | |
return edit; | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
//basic get | |
public InputStream get(String key) { | |
try { | |
DiskLruCache.Snapshot snapshot = mDiskLruCache.get(Utils.hashKeyForDisk(key)); | |
if (snapshot == null) //not find entry , or entry.readable = false | |
{ | |
Log.e(TAG, "not find entry , or entry.readable = false"); | |
return null; | |
} | |
//write READ | |
return snapshot.getInputStream(0); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
return null; | |
} | |
} | |
// ======================================= | |
// ============== 序列化 数据 读写 ============= | |
// ======================================= | |
private File getDiskCacheDir(Context context, String uniqueName) { | |
String cachePath; | |
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) | |
|| !Environment.isExternalStorageRemovable()) { | |
cachePath = context.getExternalCacheDir().getPath(); | |
} else { | |
cachePath = context.getCacheDir().getPath(); | |
} | |
return new File(cachePath + File.separator + uniqueName); | |
} | |
} | |
package com.magicpin.local.utils.images; | |
public class DiskLruCacheUtil { | |
static final Charset US_ASCII = Charset.forName("US-ASCII"); | |
static final Charset UTF_8 = Charset.forName("UTF-8"); | |
static String readFully(Reader reader) throws IOException { | |
try { | |
StringWriter writer = new StringWriter(); | |
char[] buffer = new char[1024]; | |
int count; | |
while ((count = reader.read(buffer)) != -1) { | |
writer.write(buffer, 0, count); | |
} | |
return writer.toString(); | |
} finally { | |
reader.close(); | |
} | |
} | |
/** | |
* Deletes the contents of {@code dir}. Throws an IOException if any file | |
* could not be deleted, or if {@code dir} is not a readable directory. | |
*/ | |
static void deleteContents(File dir) throws IOException { | |
File[] files = dir.listFiles(); | |
if (files == null) { | |
throw new IOException("not a readable directory: " + dir); | |
} | |
for (File file : files) { | |
if (file.isDirectory()) { | |
deleteContents(file); | |
} | |
if (!file.delete()) { | |
throw new IOException("failed to delete file: " + file); | |
} | |
} | |
} | |
static void closeQuietly(/*Auto*/Closeable closeable) { | |
if (closeable != null) { | |
try { | |
closeable.close(); | |
} catch (RuntimeException rethrown) { | |
throw rethrown; | |
} catch (Exception ignored) { | |
} | |
} | |
} | |
public static int getAppVersion(Context context) { | |
try { | |
PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); | |
return info.versionCode; | |
} catch (PackageManager.NameNotFoundException e) { | |
e.printStackTrace(); | |
} | |
return 1; | |
} | |
public static String hashKeyForDisk(String key) { | |
String cacheKey; | |
try { | |
final MessageDigest mDigest = MessageDigest.getInstance("MD5"); | |
mDigest.update(key.getBytes()); | |
cacheKey = bytesToHexString(mDigest.digest()); | |
} catch (NoSuchAlgorithmException e) { | |
cacheKey = String.valueOf(key.hashCode()); | |
} | |
return cacheKey; | |
} | |
public static String bytesToHexString(byte[] bytes) { | |
StringBuilder sb = new StringBuilder(); | |
for (int i = 0; i < bytes.length; i++) { | |
String hex = Integer.toHexString(0xFF & bytes[i]); | |
if (hex.length() == 1) { | |
sb.append('0'); | |
} | |
sb.append(hex); | |
} | |
return sb.toString(); | |
} | |
public static byte[] bitmap2Bytes(Bitmap bm) { | |
if (bm == null) { | |
return null; | |
} | |
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); | |
return baos.toByteArray(); | |
} | |
public static Bitmap bytes2Bitmap(byte[] bytes) { | |
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); | |
} | |
/** | |
* Drawable → Bitmap | |
*/ | |
public static Bitmap drawable2Bitmap(Drawable drawable) { | |
if (drawable == null) { | |
return null; | |
} | |
// 取 drawable 的长宽 | |
int w = drawable.getIntrinsicWidth(); | |
int h = drawable.getIntrinsicHeight(); | |
// 取 drawable 的颜色格式 | |
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; | |
// 建立对应 bitmap | |
Bitmap bitmap = Bitmap.createBitmap(w, h, config); | |
// 建立对应 bitmap 的画布 | |
Canvas canvas = new Canvas(bitmap); | |
drawable.setBounds(0, 0, w, h); | |
// 把 drawable 内容画到画布中 | |
drawable.draw(canvas); | |
return bitmap; | |
} | |
/* | |
* Bitmap → Drawable | |
*/ | |
@SuppressWarnings("deprecation") | |
public static Drawable bitmap2Drawable(Bitmap bm) { | |
if (bm == null) { | |
return null; | |
} | |
BitmapDrawable bd = new BitmapDrawable(bm); | |
bd.setTargetDensity(bm.getDensity()); | |
return new BitmapDrawable(bm); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment