前言
最近接到一个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(); } } } }
参数说明
项目截图:
因为assets下面有很多隐藏文件,在查找的时候会很冗余。所以我们自建了一个文件夹myjs,所以我们的assetDir参数是myjs。
结语
由于最近比较忙,暂时先写这么多,项目过一段时间补上。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android实现复制Assets文件到SD卡,包括了Android实现复制Assets文件到SD卡的使用技巧和注意事项,需要的朋友参考一下 Assets文件介绍 assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。 1. 先在Activity里面调用getAssets() 来获取AssetManager引用。 2. 再用Asse
问题内容: 我希望能够从Android设备的内部缓存中移动或复制文件,并将其放入SD卡上的永久存储区。这是我到目前为止所拥有的: 问题答案:
日志说:
我知道很多问题已经被回答了,但是在我的例子中,我的代码在Oppo、三星手机上运行正常,但是在MI、MOto G、Lenavo手机上不能运行 下面是我的代码:
目前,我的(使用的是Stackoverflow,我自己没有完整地编写)代码如下所示: 我得到错误:“打开失败;EACCES(权限被拒绝)”。 我的舱单是这样的:
本文向大家介绍Android获取assets文件夹中的数据并写入SD卡示例,包括了Android获取assets文件夹中的数据并写入SD卡示例的使用技巧和注意事项,需要的朋友参考一下 本文示例主要实现了Android获取assets文件夹中的数据并将其写入到SD卡中,该程序实现的步骤主要为:首先读取assets文件夹中的数据库,再将其写入到SD存储卡中。 完整示例代码如下: