APK安装过程    

   复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录,Android系统在sdcard上为每一个应用分配了存储路径:/sdcard/Android/data/$(应用的包路径),该路径可以通过 context.getExternalFilesDir 得到,一般应用卸载的时候,该目录也会随之被删除。

    Android资源文件分为两类: 

    第一种是res目录下存放的可编译的资源文件,编译时,系统会自动在R.java中生成资源文件的ID,所以访问这种资源比较简单,通过在程序中调用R.id.filenam  e即可。    

    另一种是assets目录下存放的原始资源文件,因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.id.filename的方式访问它们。那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk目录下,assets被绑定在apk里,以apk形式存在,并不会解压到/data/data/YourApp目录下去,所以我们无法直接获取到assets的绝对路径,因为它们根本就没有独立存在。 

     res/raw和assets的相同点:  

    1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

   res/raw和assets的不同点:   

   1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。    

   2.res/raw不可以有目录结构,而assets则可以有目录结构(在其目录下可以再建文件夹)   

   3.读取res/raw下的文件资源,通过以下方式获取输入流:InputStream is=getResources().openRawResource(R.id.filename); 读取assets下的文件资源,通过以下方式获取输入流:InputStream is =getResources()..getAssets().open("filename");  

   AssetManager管理对assets文件夹资源的访问

  查看官方API可知,AssetManager提供对应用程序的原始资源文件进行访问;这个类提供了一个低级别的API=1,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。主要用到list()及open()方法。

finalString[]        list(Stringpath)     返回指定路径下的所有文件及目录名,path是相对路径,是assets子目录。

finalInputStream     open(String fileName)      使用 ACCESS_STREAMING模式打开assets下的指定文件,fileName是相对路径,是assets子目录。

finalInputStream      open(String fileName,int accessMode)   使用显示的访问模式打开assets下的指定文件。

下面这个类,主要功能是通过递归方式,实现对assets下的某个子目录文件读取操作,并复制到指定路径。


  1. package com.study.asset;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import com.study.mylog.MyLog;
  7. import android.content.Context;
  8. import android.content.res.AssetManager;
  9. public class AssetsCopy {
  10. private Context mContext;
  11. public AssetsCopy(Context context) {
  12. mContext = context;
  13. }
  14. public boolean CopyFiles(String oldPath, String newPath) throws IOException {
  15. boolean isCopy = true;
  16. AssetManager mAssetManger = mContext.getAssets();
  17. String[] fileNames=mAssetManger.list(oldPath);// 获取assets目录下的所有文件及有文件的目录名
  18. if (fileNames.length > 0) {//如果是目录,如果是具体文件则长度为0
  19. File file = new File(newPath);
  20. file.mkdirs();//如果文件夹不存在,则递归
  21. for (String fileName : fileNames) {
  22. if(oldPath=="") //assets中的oldPath是相对路径,不能够以“/”开头
  23. CopyFiles(fileName,newPath+"/"+fileName);
  24. else
  25. CopyFiles(oldPath+"/"+fileName,newPath+"/"+fileName);
  26. }
  27. }else {//如果是文件
  28. InputStream is = mAssetManger.open(oldPath);
  29. FileOutputStream fos = new FileOutputStream(new File(newPath));
  30. byte[] buffer = new byte[1024];
  31. int byteCount=0;
  32. while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节
  33. fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流
  34. }
  35. fos.flush();//刷新缓冲区
  36. is.close();
  37. fos.close();
  38. }
  39. return isCopy;
  40. }
  41. }

Android学习--Assets资源文件读取及AssetManager介绍的更多相关文章

  1. JNI读取assets资源文件

    源自:http://www.rosoo.net/a/201112/15459.html assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取 ...

  2. Maven学习-处理资源文件

    在前面两篇文章中,我们学习了Maven的基本使用方式和Maven项目的标准目录结构.接下来,我们来看下Maven是如果管理项目中的资源文件的. Java项目的资源文件,主要用于存储系统的配置信息,以及 ...

  3. (转)Maven学习-处理资源文件

    转自:http://www.cnblogs.com/now-fighting/p/4888343.html 在前面两篇文章中,我们学习了Maven的基本使用方式和Maven项目的标准目录结构.接下来, ...

  4. Java学习-013-文本文件读取实例源代码(两种数据返回格式)

    此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 1.读取的文本文件内容以一维数组[LinkedList<String>]的形式返回,源代 ...

  5. [置顶] Android学习系列-把文件保存到SD卡上面(6)

    Android学习系列-把文件保存到SD卡上面(5) 一般多媒体文件,大文件需要保存到SD卡中.关键点如下: 1,SD卡保存目录:mnt/sdcard,一般采用Environment.getExter ...

  6. Android从assets目录下读取文件相关

    有一个需求是app的帮助文档是word格式,ios可以直接用webview加载word显示,Android不行.而美工不配合转换成图片,前端没时间把word写成html 没办法,自己搞. 步骤: 1. ...

  7. Android学习2--项目文件列表简单分析

    使用Eclipse创建的默认项目文件列表如下: src:src目录是Android工程的源程序目录,该目录用于存放Java项目的源代码 gen:gen目录存放所有自动生成的文件,在这个目录中最关键的文 ...

  8. Android中的资源文件

    最近复习Android资源文件的内容,留下点记录以备后用. Android中的资源主要是指存放在应用程序或者Framework相应包下/res中的内容.它们可以被本地化,如果必要的话会被编译成二进制文 ...

  9. Android之assets资源目录的各种操作

    第一种方法:       String path = file:///android_asset/文件名; 第二种方法:         InputStream abpath = getClass() ...

随机推荐

  1. Dcloud课程2 什么是Dcloud

    Dcloud课程2  什么是Dcloud 一.总结 一句话总结:DCloud提供了一套快速开发应用的跨平台技术方案. 1.DCloud的产品架构? MUI+(H5+)+HBuilder 2.什么是MU ...

  2. Altium Designer导入pcb原件之后都是绿的

  3. Java基础学习总结(31)——Java思维导图

  4. struts2_7_Action类中方法的动态调用

    (一)直接调用方法(不推荐使用) 1)Action类: private String savePath; public String getSavePath() { return savePath; ...

  5. [Angular] Component architecture and Reactive Forms

    It it recommeded that when deals with form component, we can create a container component to hold st ...

  6. 6.1、Android硬件访问服务之框架

    1.通过前面led点亮的例子,其流程如下 Android app(java)(通过loadLibrary)——>C library(C库做如下事情)——>1.JNI_Onload 2.jn ...

  7. springboot下静态资源的处理(转)

    在SpringBoot中有默认的静态资源文件相关配置,需要通过如下源码跟踪: WebMvcAutoConfiguration-->configureResourceChain(method)-- ...

  8. 【redis,1】java操作redis: 将string、list、map、自己定义的对象保存到redis中

    一.操作string .list .map 对象 1.引入jar: jedis-2.1.0.jar   2.代码 /**      * @param args      */     public s ...

  9. [NodeJS] Use Now alias for custom sub-domains

    Now is a great way to deploy your node application, but the generated URLs aren't memorable or easil ...

  10. 关于重定向RedirectAttributes的用法(转)

    原文地址:https://zhuanlan.zhihu.com/p/21353217?refer=pengsong-java RedirectAttributes 是Spring mvc 3.1版本之 ...