声明:本博客带有[原创]标志的均为原创文章,转载时请注明出处http://blog.sina.com.cn/felonwan并声明作者felonwan。
参考资料:
http://android.9tech.cn/news/2013/1125/38867.html
http://my.oschina.net/haquanwen/blog/54746
在网上找了一些方法,但是测试时都有问题。本文下面的代码主要来自第一个网址,但是修正了其把空文件当成目录、以及不能复制没有后缀的文件的bug,另外添加返回值显示复制是否成功。有什么问题请在下面回复,有什么错误也请在下面回复指正。
在4.2.2上测试的结果是:对于空目录,由于安卓的AssetManager不能列出,所以无法复制!如果有很重要的空目录需要复制,请使用压缩包或其它方法解决。
注意:如果是复制到/data分区中的apk文件指定的数据存储区,请使用Context.getFilesDir().getPath(),比如在MainActivity.java的OnCreate里使用this.getFilesDir().getPath()。(笔者还不明白这个Context到底该怎么引用。另外,如果直接在MainActivity里直接使用没有语法错误,但运行时会出现闪退。)
首先,复制单个文件:
private Boolean CopyAssetsFile(String filename, String des) {
Boolean isSuccess = true;
//复制安卓apk的assets目录下任意路径的单个文件到des文件夹,注意是否对des有写权限
AssetManager assetManager = this.getAssets();
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(filename);
String newFileName = des + "/" + filename;
out = new FileOutputStream(newFileName);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (Exception e) {
e.printStackTrace();
isSuccess = false;
}
return isSuccess;
}
然后是文件夹的复制,需要调用上面的函数:
private Boolean CopyAssetsDir(String src,String des) {
//复制安卓Assets下的“非空目录”到des文件夹,注意是否对des有写权限
Boolean isSuccess = true;
String[] files;
try
{
files = this.getResources().getAssets().list(src);
}
catch (IOException e1)
{
return false;
}
if(files.length==0){
isSuccess = CopyAssetsFile(src,des);//对于文件直接复制
if(!isSuccess)
return isSuccess;
}
else{
File srcfile = new File(des+"/"+src);
if(!srcfile.exists()){
if(srcfile.mkdirs()){//对于目录自行创建
for(int i=0;i
<files.length;i++){
//新浪博客的限制,这里的小于号请自行替换为英文的
isSuccess = CopyAssetsDir(src + "/"+files[i], des);//递归调用
if(!isSuccess)
return isSuccess;
}
}
else{
return false;
}
}
}
return isSuccess;
}