Android復(fù)制assets文件到SD卡
前言
最近接到一個js文件緩存任務(wù),即通過攔截我們webView的url,首先從文件加載js文件,文件里沒有的話就去assets里面Copy過來。感覺這個工具類挺有用的,所以先發(fā)上來供大家參考。稍后有時間會把整個項目思路寫出來。
項目代碼
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;
/**
* 目標(biāo)文件夾
*/
private String dir;
public CopyAssetsToSd(Context context, String assetDir, String dir) {
mContext = context;
this.assetDir = assetDir;
this.dir = dir;
new MyAsyncTask().execute();
}
/**
* 監(jiān)聽復(fù)制完成
*/
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方法中進(jìn)行異步任務(wù)的處理.
@Override
protected Bitmap doInBackground(String... params) {
copyAssets(assetDir, dir);
return null;
}
//onPostExecute用于UI的更新.此方法的參數(shù)為doInBackground方法返回的值.
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (mOnCopyListener != null) {
//復(fù)制完成的監(jiān)聽
mOnCopyListener.success();
}
}
}
}
參數(shù)說明

項目截圖:

因為assets下面有很多隱藏文件,在查找的時候會很冗余。所以我們自建了一個文件夾myjs,所以我們的assetDir參數(shù)是myjs。
結(jié)語
由于最近比較忙,暫時先寫這么多,項目過一段時間補上。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android加載Assets目錄中Xml布局文件
- Android實現(xiàn)復(fù)制Assets文件到SD卡
- 詳解vue2.0 資源文件assets和static的區(qū)別
- iOS開發(fā)之AssetsLibrary框架使用詳解
- Android studio 添加assets文件夾的方法
- 詳解Vue-cli中的靜態(tài)資源管理(src/assets和static/的區(qū)別)
- vue2.0 資源文件assets和static的區(qū)別詳解
- Android開發(fā)實現(xiàn)讀取Assets下文件及文件寫入存儲卡的方法
- android讀取assets中Excel表格并顯示
- Android獲取其他應(yīng)用中的assets資源
相關(guān)文章
Android實現(xiàn)類似360,QQ管家那樣的懸浮窗
用到的就是WindowManager以及WindowManager.LayoutParams,對這個LayoutParams做文章,當(dāng)設(shè)置為屬性后,然后,創(chuàng)建一個View,將這個View添加到WindowManager中就行2013-06-06
Android自定義View實現(xiàn)QQ音樂中圓形旋轉(zhuǎn)碟子
這篇文章主要為大家詳細(xì)介紹了Android自定義View實現(xiàn)QQ音樂中圓形旋轉(zhuǎn)碟子,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android studio無法創(chuàng)建類和接口和提示問題的完美解決辦法
這篇文章主要介紹了Android studio無法創(chuàng)建類和接口和提示問題解決辦法,內(nèi)容比較簡單,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-04-04
Android 使用AsyncTask實現(xiàn)多線程斷點續(xù)傳
本文將詳細(xì)講解如何使用AsyncTask來實現(xiàn)多線程的斷點續(xù)傳下載功能,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
Android實現(xiàn)簡單的自定義ViewGroup流式布局
本文我們將一起復(fù)習(xí)一下ViewGroup的測量布局方式。然后會以入門級的 FlowLayout 為例,來看看流式布局是如何測量與布局的,感興趣的可以了解一下2022-12-12
詳解如何在Flutter中獲取設(shè)備標(biāo)識符
這篇文章主要為大家介紹了幾種通過Flutter讀取設(shè)備信息的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下2022-04-04

