標籤:緩衝 統一管理 android
import android.content.Context;import android.os.Environment;import android.support.annotation.Nullable;import com.lidroid.xutils.db.annotation.NotNull;import junit.framework.Assert;import .R;import .utils.*;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;/** * Created by xiaoyee on 7/12/15. * 緩衝管理工具類 * <p> * 如若想添加緩衝路徑,則在{@link .constants.IYDCache.DirType DirType}中添加對應的類型 * </p> */public class IYDCache { private static final String TAG = "IYDCache"; public static final String CACHE_ROOT = "root_cache"; public static final String CACHE_VIDEO = "video_cache"; public static final String CACHE_IMAGE = "image_cache"; public static final String CACHE_VIDEO_MATERIAL = "material_cache"; //TODO 此項待修改 private static String mCacheDir; private static String mPicCachePath; private static String ROOT_DIR; /** * 儲存所有的快取檔案路徑 * <p> * <ui> * <li>key--{@link DirType#dirName() DirType的dirName方法傳回值}</li> * <li>value--完整路徑,如 /storage/emulated/0/Android/root_cache/video_cache </li> * </ui> * </p> */ private static HashMap<String, String> mCacheDirBox = new HashMap<>(); /** * 第一次因為父目錄未先初始化而失敗的類型 */ private static List<DirType> mInitFailedDirType = new ArrayList<>(); /** * 一般檔案的首碼,如視頻檔案名稱為"iydXXXX.mp4" */ private static final String IYD = "iyd"; /** * 是否成功初始化 */ private static boolean mIsInited = false; /** * 檔案類型 */ public enum FileType { PNG(".png"), JPG(".jpg"), MP4(".mp4"); /** * 尾碼名 */ final String mSuffix; FileType(String suffix) { this.mSuffix = suffix; } /** * 擷取尾碼名 * * @return 指定類型的尾碼名,如‘.mp4‘ */ public String suffix() { return this.mSuffix; } } /** * 根據緩衝類型,快取檔案類型以及其url擷取此項該有的完整路徑,如"/storage/emulated/0/Android/root_cache/video_cache/iyd1736054267.mp4" * * @param type 緩衝類型。 此處用枚舉,目的是確保想用的緩衝路徑已經添加了,如果沒有記得添加 * @param url 緩衝目標的url,片對應的連結 * @param fileType 檔案類型,如mp4,png等,如需擴充,請在{@link .constants.IYDCache.FileType FileType}中添加 * @return 結果形如 /storage/emulated/0/Android/root_cache/video_cache/iyd1736054267.mp4 */ public static String getFileNameWithPath(DirType type, String url, FileType fileType) { return getIYDCacheDirThisType(type) + File.separator + generateNameFromUrl(url, fileType); } /** * 根據url組建檔案名,此處保證如果url相同,那麼傳回值也相同 * <p> * //NOTE: 注意:此檔案名稱含有尾碼 * </p> * <p> * 實際是 " iyd + url的雜湊值 + 尾碼名 " 的拼接 * </p> * * @param url 目標對應的url * @param fileType 檔案類型 * @return 結果形如 iyd1736054267.mp4 */ public static String generateNameFromUrl(String url, FileType fileType) { if (StringUtils.isBlank(url)) { return StringUtils.empty(); } return IYD + url.hashCode() + fileType.suffix(); } /** * 根據雜湊值,組建檔案名 無尾碼名 * * @param hashcode 目標雜湊值 * @return 返回結果形如 iyd1736054267 */ public static String generateNameFromHashcode(int hashcode) { return IYD + hashcode; } /** * 基於對象,組建檔案名;無尾碼名 * <p> * 此處目的是保證同一個對象,返回同樣的檔案名稱,但是依賴於對象的equal方法和hashCode方法 * </p> * * @return 返回結果形如 iyd1736054267 */ public static String generateNameFromObj(Object obj) { return IYD + obj.hashCode(); } /** * 擷取指定緩衝類型的 快取檔案夾 * <p> * 注意,傳回值可以為空白 * </p> * * @param type 緩衝類型 {@link .constants.IYDCache.DirType} * @return 形如"/storage/emulated/0/Android/root_cache/video_cache"或“/storage/emulated/0/Android/root_cache” */ @Nullable public static String getIYDCacheDirThisType(DirType type) { if (!mIsInited) { throw new IllegalArgumentException(ResourceUtils.getString(R.string.not_init) + "確保在application中調用了本類的initCacheDir方法"); } String key = type.dirName(); if (mCacheDirBox.containsKey(key)) { return mCacheDirBox.get(key); } else { LogCus.e(TAG, "沒找到與此對應的目錄" + key); return StringUtils.empty(); } } /** * 清空指定快取檔案夾中的所有內容 * @param dirType 指定快取檔案夾類型 對應{@link .constants.IYDCache.DirType DirType} */ public static void clearCacheThisDir(final DirType dirType) { new Thread( new Runnable() { @Override public void run() { FileUtils.clearDir(getIYDCacheDirThisType(dirType)); } } ).start(); } /** * 初始化所有快取檔案夾,應該在application的onCreate方法中調用 */ public static void initCacheDir(Context context) { if (!SDCardUtil.isSDCardExist()) { ToastUtils.show(context, ResourceUtils.getString(R.string.check_memory_is_ok)); return; } File androidDir = Environment.getExternalStoragePublicDirectory("Android"); ROOT_DIR = androidDir.getAbsolutePath(); mIsInited = true; //初始化所有快取檔案夾 DirType[] allDirType = DirType.values(); for (DirType dirType : allDirType) { initDirWithParentDirType(dirType); } //初始化失敗的那些 for (DirType dirType : mInitFailedDirType) { initDirWithParentDirType(dirType); } } private static void initDirWithParentDirType(DirType childDir) { String parentDirPath; //TODO 先後問題,如果父目錄未初始化時,先初始化了子目錄。。。 //擷取父目錄檔案夾路徑 if (childDir == DirType.ROOT) { //如果是根目錄,那麼直接定義 if (StringUtils.isBlank(ROOT_DIR)) { throw new IllegalArgumentException("請先初始化根目錄,也就是先調用 ROOT_DIR = androidDir.getAbsolutePath(); "); } parentDirPath = ROOT_DIR; } else { //否則,直接設定;父目錄檔案夾完整路徑,應該通過 父目錄對應的目錄名獲得 parentDirPath = mCacheDirBox.get(childDir.parentDirType().dirName()); } LogCus.d("父路徑>>>" + parentDirPath); if (StringUtils.isBlank(parentDirPath) || !parentDirPath.contains(ROOT_DIR)) { mInitFailedDirType.add(childDir); return; } String dirPath = spliceSeparator(parentDirPath, childDir.dirName()); if (!FileUtils.isFolderExistOrCreateSuccess(dirPath)) { LogCus.d("初始設定檔案夾失敗" + dirPath); return; } mCacheDirBox.put(childDir.dirName(), dirPath); } private static String spliceSeparator(String... dir) { StringBuilder result = new StringBuilder(); for (String s : dir) { result.append(s); result.append(File.separator); } return result.toString(); } public static String getCacheDir() { return mCacheDir; } public static void setCacheDir(String mCacheDir) { IYDCache.mCacheDir = mCacheDir; } /** * 快取檔案夾類型,//NOTE: 確保添加進來的類型,其dir與parentDir路徑在此類中定義 * <p> * 要注意此枚舉類型中的順序,父目錄一定要寫在子目錄之前 * </p> */ public enum DirType { /** * 緩衝根目錄 iyd_cache */ ROOT(CACHE_ROOT, ROOT_DIR), /** * 視頻緩衝目錄 video_cache; 其父目錄為 CACHE_ROOT */ VIDEO(CACHE_VIDEO, CACHE_ROOT), /** * 圖片緩衝目錄 image_cache; 其父目錄為 CACHE_ROOT */ IMAGE(CACHE_IMAGE, CACHE_ROOT), /** * 素材緩衝目錄 material_cache; 其父目錄為 CACHE_ROOT */ MATERIAL(CACHE_VIDEO_MATERIAL, CACHE_ROOT),; private String mDir; private String mParentDir; public String getParentDir() { return mParentDir; } /** * @param dir 目前的目錄名 * @param parentDir 父目錄名 */ DirType(String dir, String parentDir) { this.mDir = dir; this.mParentDir = parentDir; } public void setParentDir(String parentDir) { this.mParentDir = parentDir; } /** * 擷取快取檔案夾名稱,如video_cache * * @return 返回結果形如 video_cache */ public String dirName() { return mDir; } /** * 擷取父目錄的DirType,調用此方法時,一定確保其不是ROOT */ public DirType parentDirType() { DirType[] dirTypes = DirType.values(); for (DirType dirType : dirTypes) { //此項的父目錄,和某項的目前的目錄對應 if (mParentDir.equals(dirType.dirName())) { return dirType; } } throw new IllegalArgumentException("沒找到對應的父資料夾>>>" + mParentDir + ";1、請確保已經添加了並且mParentDir是對應的;2、一定確保調用此方法的類型不是ROOT"); } }}
清空檔案夾中的方法
/** * removes subdirectories and their contents */ static void purgeDirectory(File dir) { for (File file: dir.listFiles()) { if (file.isDirectory()) purgeDirectory(file); file.delete(); } } /** * 清空檔案夾中的內容,包括子目錄 * @param path */ public static void clearDir(String path) { //LogCus.d("刪除" + path + "目錄下的所有內容"); if (StringUtils.isBlank(path)) { return; } File file = new File(path); purgeDirectory(file); }
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
緩衝統一管理工具類--android