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

本文介绍了一种在Android中从apk的assets目录复制文件和文件夹的方法,并修复了常见问题,如将空文件误认为目录及无法复制无后缀名文件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:本博客带有[原创]标志的均为原创文章,转载时请注明出处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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值