[原创]安卓复制assets目录下的文件及文件夹(1)

声明:本博客带有[原创]标志的均为原创文章,转载时请注明出处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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值