Android学习--Assets资源文件读取及AssetManager介绍
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下的某个子目录文件读取操作,并复制到指定路径。
-
package com.study.asset;
-
-
import java.io.File;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.io.InputStream;
-
-
import com.study.mylog.MyLog;
-
-
import android.content.Context;
-
import android.content.res.AssetManager;
-
-
public class AssetsCopy {
-
-
private Context mContext;
-
public AssetsCopy(Context context) {
-
mContext = context;
-
}
-
-
public boolean CopyFiles(String oldPath, String newPath) throws IOException {
-
boolean isCopy = true;
-
AssetManager mAssetManger = mContext.getAssets();
-
String[] fileNames=mAssetManger.list(oldPath);// 获取assets目录下的所有文件及有文件的目录名
-
-
if (fileNames.length > 0) {//如果是目录,如果是具体文件则长度为0
-
File file = new File(newPath);
-
file.mkdirs();//如果文件夹不存在,则递归
-
for (String fileName : fileNames) {
-
if(oldPath=="") //assets中的oldPath是相对路径,不能够以“/”开头
-
CopyFiles(fileName,newPath+"/"+fileName);
-
else
-
CopyFiles(oldPath+"/"+fileName,newPath+"/"+fileName);
-
}
-
}else {//如果是文件
-
InputStream is = mAssetManger.open(oldPath);
-
FileOutputStream fos = new FileOutputStream(new File(newPath));
-
byte[] buffer = new byte[1024];
-
int byteCount=0;
-
while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节
-
fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流
-
}
-
fos.flush();//刷新缓冲区
-
is.close();
-
fos.close();
-
}
-
return isCopy;
-
}
-
-
}
Android学习--Assets资源文件读取及AssetManager介绍的更多相关文章
- JNI读取assets资源文件
源自:http://www.rosoo.net/a/201112/15459.html assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取 ...
- Maven学习-处理资源文件
在前面两篇文章中,我们学习了Maven的基本使用方式和Maven项目的标准目录结构.接下来,我们来看下Maven是如果管理项目中的资源文件的. Java项目的资源文件,主要用于存储系统的配置信息,以及 ...
- (转)Maven学习-处理资源文件
转自:http://www.cnblogs.com/now-fighting/p/4888343.html 在前面两篇文章中,我们学习了Maven的基本使用方式和Maven项目的标准目录结构.接下来, ...
- Java学习-013-文本文件读取实例源代码(两种数据返回格式)
此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 1.读取的文本文件内容以一维数组[LinkedList<String>]的形式返回,源代 ...
- [置顶] Android学习系列-把文件保存到SD卡上面(6)
Android学习系列-把文件保存到SD卡上面(5) 一般多媒体文件,大文件需要保存到SD卡中.关键点如下: 1,SD卡保存目录:mnt/sdcard,一般采用Environment.getExter ...
- Android从assets目录下读取文件相关
有一个需求是app的帮助文档是word格式,ios可以直接用webview加载word显示,Android不行.而美工不配合转换成图片,前端没时间把word写成html 没办法,自己搞. 步骤: 1. ...
- Android学习2--项目文件列表简单分析
使用Eclipse创建的默认项目文件列表如下: src:src目录是Android工程的源程序目录,该目录用于存放Java项目的源代码 gen:gen目录存放所有自动生成的文件,在这个目录中最关键的文 ...
- Android中的资源文件
最近复习Android资源文件的内容,留下点记录以备后用. Android中的资源主要是指存放在应用程序或者Framework相应包下/res中的内容.它们可以被本地化,如果必要的话会被编译成二进制文 ...
- Android之assets资源目录的各种操作
第一种方法: String path = file:///android_asset/文件名; 第二种方法: InputStream abpath = getClass() ...
随机推荐
- numpy,scipy,pandas 和 matplotlib
numpy,scipy,pandas 和 matplotlib 本文会介绍numpy,scipy,pandas 和 matplotlib 的安装,环境为Windows10. 一般情况下,如果安装了Py ...
- java中那些已经有的好用轮子
后续补充 IOUtils http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html ...
- python中线程、进程和协程的区别
进程是资源分配的单位 线程是操作系统调度的单位 协程,又称微线程,纤程,协程的切换只是单纯的操作CPU的上下文,资源很小,效率高 进程切换需要的资源很最大,效率很低 一个程序至少有一个进程,一个进程至 ...
- 每天五个java相关面试题(3)
1. Servlet的生命周期是什么? 答: 第一次请求: 构造方法->init() -> service() -> doGet()/doPost() 以后的请求:service() ...
- 【b091&&z11】潜伏者
Time Limit: 1 second Memory Limit: 128 MB [问题描述] R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历尽艰险后,潜伏于S国的R国间谍小 ...
- 利用VS安装项目打包软件的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 昨天摸索了一下,发现使用VS安装项目来打包软件还是挺方便的. 1. 创建一个安装项目工程,如下图: 2. 设置工程属性 ...
- [Angular2 Form] Validation message for Reactive form
<div class="form-field"> <label>Confirm Password: </label> <input typ ...
- HQL和SQL的区别
1.hql与sql的区别 sql 面向数据库表查询 hql 面向对象查询 hql : from 后面跟的 类名+类对象 where 后 用 对象的属性做条件 sql: from 后面跟的是表名 ...
- javascript中0级DOM和2级DOM事件模型浅析 分类: C1_HTML/JS/JQUERY 2014-08-06 15:22 253人阅读 评论(0) 收藏
Javascript程序使用的是事件驱动的设计模式,为一个元素添加事件监听函数,当这个元素的相应事件被触发那么其添加的事件监听函数就被调用: <input type="button&q ...
- jdbc之二:DAO模式 分类: B1_JAVA 2014-04-29 15:13 1536人阅读 评论(0) 收藏
详细代码请参见 https://github.com/lujinhong/dao 一.前期准备 1.创建数据库 create database filter_conf; 2.创建表并插入数据 crea ...