美文网首页
android sd卡缓存

android sd卡缓存

作者: XX杰 | 来源:发表于2018-11-08 11:43 被阅读0次

    1、通过url下载内容到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();
            }
        }
    
    //  将下载的内容的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;
                    // 储存下载文件的目录
                    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+", "储存下载文件的目录  " + 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();
            }
        }
    
    // 根据url获得下载的文件的路径
        public String getGifCacheData(String url) {
            return pathLruCache.get(url);
        }
    

    相关文章

      网友评论

          本文标题:android sd卡缓存

          本文链接:https://www.haomeiwen.com/subject/ckaixqtx.html