Android复制assets文件到SD卡

Android 复制assets里面的文件到SD卡

前言

最近接到一个js文件缓存任务,即通过拦截我们webView的url,首先从文件加载js文件,文件里没有的话就去assets里面Copy过来。感觉这个工具类挺有用的,所以先发上来供大家参考。稍后有时间会把整个项目思路写出来。

项目代码

public class CopyAssetsToSd {
    final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, 1, TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(100));
    private Context mContext;
    /**
     * assets的文件夹 js
     */
    private String assetDir;
    /**
     * 目标文件夹
     */
    private String dir;

    public CopyAssetsToSd(Context context, String assetDir, String dir) {
        mContext = context;
        this.assetDir = assetDir;
        this.dir = dir;
        new MyAsyncTask().execute();

    }

    /**
     * 监听复制完成
     */
    public interface onCopyListener {
        void success();
    }

    private onCopyListener mOnCopyListener;

    public void setOnCopyListener(onCopyListener onCopyListener) {
        this.mOnCopyListener = onCopyListener;
    }

    public void copyAssets(final String assetDir, final String dir) {
    //下面是线程池的方法
        threadPoolExecutor.execute(new Runnable() {
            @Override
            public void run() {
                String[] files;
                AssetManager assetManager = mContext.getResources().getAssets();
                try {
                    // 获得Assets文件夹下指定文件夹一共有多少文件
                    files = assetManager.list(assetDir);
                } catch (IOException e1) {
                    return;
                }
                final File mWorkingPath = new File(dir);
                // 如果文件路径不存在
                if (!mWorkingPath.exists()) {
                    mWorkingPath.mkdirs();
                }

                for (int i = 0; i < files.length; i++) {
                    int finalI = i;

                    try {
                        // 获得每个文件的名字
                        String fileName = files[finalI];
                        File outFile = new File(mWorkingPath + "/" + fileName);
                        // 判断文件是否存在
                        if (!outFile.exists()) {
                            outFile.createNewFile();
                            FileOutputStream out = new FileOutputStream(outFile);
                            InputStream in = null;
                            if (0 != assetDir.length())
                                in = assetManager.open(assetDir + "/" + fileName);
                            else
                                in = assetManager.open(fileName);
                            // Transfer bytes from in to out
                            byte[] buf = new byte[1024];
                            int len;
                            while ((len = in.read(buf)) > 0) {
                                out.write(buf, 0, len);
                            }
                            in.close();
                            out.close();
                        } else {
                        }
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        });
        //下面是线程的方法
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                String[] files;
//                AssetManager assetManager = mContext.getResources().getAssets();
//                try {
//                    // 获得Assets一共有几多文件
//                    files = assetManager.list(assetDir);
//                } catch (IOException e1) {
//                    return;
//                }
//                final File mWorkingPath = new File(dir);
//                // 如果文件路径不存在
//                if (!mWorkingPath.exists()) {
//                    mWorkingPath.mkdirs();
//                }
//
//                for (int i = 0; i < files.length; i++) {
//                    int finalI = i;
//
//                    try {
//                        // 获得每个文件的名字
//                        String fileName = files[finalI];
//                        File outFile = new File(mWorkingPath + "/" + fileName);
//                        // 判断文件是否存在
//                        if (!outFile.exists()) {
//                            outFile.createNewFile();
//                            FileOutputStream out = new FileOutputStream(outFile);
//                            InputStream in = null;
//                            if (0 != assetDir.length())
//                                in = assetManager.open(assetDir + "/" + fileName);
//                            else
//                                in = assetManager.open(fileName);
//                            // Transfer bytes from in to out
//                            byte[] buf = new byte[1024];
//                            int len;
//                            while ((len = in.read(buf)) > 0) {
//                                out.write(buf, 0, len);
//                            }
//                            in.close();
//                            out.close();
//                        } else {
//
//
//                        }
//                    } catch (FileNotFoundException e) {
//                        e.printStackTrace();
//                    } catch (IOException e) {
//                        e.printStackTrace();
//                    }
//                }
//
//            }
//
//        }).start();

    }

    class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {

        //onPreExecute用于异步处理前的操作
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        //在doInBackground方法中进行异步任务的处理.
        @Override
        protected Bitmap doInBackground(String... params) {
            copyAssets(assetDir, dir);
            return null;
        }

        //onPostExecute用于UI的更新.此方法的参数为doInBackground方法返回的值.
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (mOnCopyListener != null) {
            //复制完成的监听
                mOnCopyListener.success();
            }
        }
    }
}

参数说明

参数 解释
assetDir assets下面的某个文件夹(请看下面我的项目截图)
dir 目标文件夹(要把assets文件复制到这里)

项目截图
Android复制assets文件到SD卡_第1张图片
因为assets下面有很多隐藏文件,在查找的时候会很冗余。所以我们自建了一个文件夹myjs,所以我们的assetDir参数是myjs

结语

由于最近比较忙,暂时先写这么多,项目过一段时间补上。

你可能感兴趣的:(android开发)