緩衝統一管理工具類--android

來源:互聯網
上載者:User

標籤:緩衝   統一管理   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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.