您的位置:首页 > 移动开发 > Android开发

Android复制assets目录下的文件到另一个目录

2017-12-15 11:44 483 查看
项目中需要把一些模型文件打包到apk中,安装的时候释放到手机中,APP启动时调用。

Android除了提供/res目录存放资源文件外,在/assets目录也会提供存放资源文件,且assets 目录中的文件,会不经压缩打包至APK包中。在/res下是可编译的资源文件, 这种资源文件系统会在R.java里面自动生成该资源文件的ID,访问也很简单,只需要调用R.XXX.id即可;在/assets目录下面不会在R.java里面自动生成ID,所以读取assets目录下面的资源文件需要提供路径,我们可以通过AssetManager类来访问这些文件。

AssetManager提供了如下方法用于处理assets:

String[] list(String path);//列出该目录下的下级文件和文件夹名称

InputStream open(String fileName);//以顺序读取模式打开文件,默认模式为ACCESS_STREAMING

InputStream open(String fileName, int accessMode);//以指定模式打开文件。读取模式有以下几种:
//ACCESS_UNKNOWN : 未指定具体的读取模式
//ACCESS_RANDOM : 随机读取
//ACCESS_STREAMING : 顺序读取
//ACCESS_BUFFER : 缓存读取
void close()//关闭AssetManager实例


实现代码:

/assets目录下的文件:



/**
*  从assets目录中复制整个文件夹内容,考贝到 /data/data/包名/files/目录中
*  @param  activity  activity 使用CopyFiles类的Activity
*  @param  filePath  String  文件路径,如:/assets/aa
*/
public static void copyAssetsDir2Phone(Activity activity, String filePath){
try {
String[] fileList = activity.getAssets().list(filePath);
if(fileList.length>0) {//如果是目录
File file=new File(activity.getFilesDir().getAbsolutePath()+ File.separator+filePath);
file.mkdirs();//如果文件夹不存在,则递归
for (String fileName:fileList){
filePath=filePath+File.separator+fileName;

copyAssetsDir2Phone(activity,filePath);

filePath=filePath.substring(0,filePath.lastIndexOf(File.separator));
Log.e("oldPath",filePath);
}
} else {//如果是文件
InputStream inputStream=activity.getAssets().open(filePath);
File file=new File(activity.getFilesDir().getAbsolutePath()+ File.separator+filePath);
Log.i("copyAssets2Phone","file:"+file);
if(!file.exists() || file.length()==0) {
FileOutputStream fos=new FileOutputStream(file);
int len=-1;
byte[] buffer=new byte[1024];
while ((len=inputStream.read(buffer))!=-1){
fos.write(buffer,0,len);
}
fos.flush();
inputStream.close();
fos.close();
showToast(activity,"模型文件复制完毕");
} else {
showToast(activity,"模型文件已存在,无需复制");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 将文件从assets目录,考贝到 /data/data/包名/files/ 目录中。assets 目录中的文件,会不经压缩打包至APK包中,使用时还应从apk包中导出来
* @param fileName 文件名,如aaa.txt
*/
public static void copyAssetsFile2Phone(Activity activity, String fileName){
try {
InputStream inputStream = activity.getAssets().open(fileName);
//getFilesDir() 获得当前APP的安装路径 /data/data/包名/files 目录
File file = new File(activity.getFilesDir().getAbsolutePath() + File.separator + fileName);
if(!file.exists() || file.length()==0) {
FileOutputStream fos =new FileOutputStream(file);//如果文件不存在,FileOutputStream会自动创建文件
int len=-1;
byte[] buffer = new byte[1024];
while ((len=inputStream.read(buffer))!=-1){
fos.write(buffer,0,len);
}
fos.flush();//刷新缓存区
inputStream.close();
fos.close();
showToast(activity,"模型文件复制完毕");
} else {
showToast(activity,"模型文件已存在,无需复制");
}
} catch (IOException e) {
e.printStackTrace();
}
}
copyAssetsDir2Phone复制文件夹,copyAssetsFile2Phone复制某个文件,getFilesDir() 获得当前APP的安装路径 /data/data/包名/files 目录。
调用方法:

runOnUiThread(new Runnable() {
@Override
public void run() {
copyAssetsDir2Phone(MainActivity.this,"face");
}
});

final String configPath = getFilesDir().getAbsolutePath() + "/face/configure";


经测试,文件拷贝成功。

参考文章:

http://mobile.51cto.com/aprogram-387591.htm

http://blog.csdn.net/greathfs/article/details/52123984

http://blog.csdn.net/yunliupan/article/details/17116605
http://blog.csdn.net/etzmico/article/details/7786525/

http://blog.csdn.net/yunliupan/article/details/17116605
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: