android sd卡緩存

1、通過url下載內(nèi)容到sd卡中的download的文件夾里面,并把路徑加入到cache的緩存里。
2、刪除你下載的所有文件和文件夾
3、下載使用的是okHttp

上代碼

import android.os.Environment;
import android.support.v4.util.LruCache;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class DownLoader {

    final String filename = "YiCache";  // 保存的文件名
    private LruCache<String, String> pathLruCache;

    private static DownLoader Instance;

    private DownLoader() {
    }

    public static DownLoader getInstance() {
        if (Instance == null) {
            synchronized (DownLoader.class) {
                Instance = new DownLoader();
            }
        }

        return Instance;
    }
  //  清空下載的文件夾并包括里面的文件
    public void clean() {
        if (pathLruCache != null) {
            deleteFile(filename);
            pathLruCache.evictAll();
        }
    }

//  將下載的內(nèi)容的sd卡路徑保存到cache中
    void addCacheData(String url, String data) {
        if (pathLruCache == null) {
            int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
            int cacheSize = maxMemory / 8;
            pathLruCache = new LruCache<String, String>(cacheSize);
        }

        if (data != null) {
            pathLruCache.put(url, data);
        }
    }

//  開始下載
    public void prepareResourcse(final String url, final DownLoadOKCallback listener) {

        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 下載失敗
                Log.v("Yi+", "下載失敗  ");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                InputStream is = null;
                byte[] buf = new byte[2048];
                int len = 0;
                FileOutputStream fos = null;
                // 儲(chǔ)存下載文件的目錄
                String savePath = isExistDir(filename);
                try {
                    is = response.body().byteStream();
                    long total = response.body().contentLength();
                    File file = new File(savePath, getNameFromUrl(url));
                    fos = new FileOutputStream(file);
                    long sum = 0;
                    while ((len = is.read(buf)) != -1) {
                        fos.write(buf, 0, len);
                        sum += len;
                        int progress = (int) (sum * 1.0f / total * 100);
                        // 下載中
//                            listener.onDownloading(progress);
                    }
                    fos.flush();
                    // 下載完成
                    addCacheData(url,file.getAbsolutePath());
                    Log.v("Yi+", "儲(chǔ)存下載文件的目錄  " + file.getAbsolutePath());
                    if (listener != null) {
                        listener.onDownloadSuccess();
                    }

                } catch (Exception e) {
                    Log.v("Yi+", "下載失敗  " + e.getMessage());
                } finally {
                    try {
                        if (is != null)
                            is.close();
                    } catch (IOException e) {
                    }
                    try {
                        if (fos != null)
                            fos.close();
                    } catch (IOException e) {
                    }
                }
            }
        });
    }

    /**
     * @param url
     * @return 從下載連接中解析出文件名
     */
    private String getNameFromUrl(String url) {
        return url.substring(url.lastIndexOf("/") + 1);
    }

/ /  建立下載文件夾
    private String isExistDir(String saveDir) throws IOException {
        // 下載位置
        File downloadFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), saveDir);
        if (!downloadFile.mkdirs()) {
            downloadFile.createNewFile();
        }
        String savePath = downloadFile.getAbsolutePath();
        return savePath;
    }

    private void deleteFile(String saveDir) {
        File downloadFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), saveDir);
        if (downloadFile.exists()) {
            RecursionDeleteFile(downloadFile);
        }
    }

    private static void RecursionDeleteFile(File file) {
        if (file.isFile()) {
            file.delete();
            return;
        }
        if (file.isDirectory()) {
            File[] childFile = file.listFiles();
            if (childFile == null || childFile.length == 0) {
                file.delete();
                return;
            }
            for (File f : childFile) {
                RecursionDeleteFile(f);
            }
            file.delete();
        }
    }

// 根據(jù)url獲得下載的文件的路徑
    public String getGifCacheData(String url) {
        return pathLruCache.get(url);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,058評(píng)論 25 709
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,003評(píng)論 2 59
  • 前言 android中圖片加載框架有很多,所有框架最終達(dá)到的目都是在Android平臺(tái)上以極度簡(jiǎn)單的方式加載和展示...
    luoqiang108閱讀 28,550評(píng)論 7 120
  • 王曉杰_2c01閱讀 161評(píng)論 0 0

友情鏈接更多精彩內(nèi)容