一、Android资源文件分类

Android资源文件大致可以分为两种:
. 一种是res目录下存放的可编译的资源文件.
这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可;

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

还好Android系统为我们提供了一个AssetManager工具类。
查看官方API可知,AssetManager提供对应用程序的原始资源文件进行访问;
这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。

二、AssetManager类

1. 概述:
提供对应用程序的原始资源文件进行访问;
这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。
通过getAssets()方法获取AssetManager对象。

2. AssetManager类常用方法:
Public Methods :
. final String[] list(String path)
返回指定路径下的所有文件及目录名。

. final InputStream open(String fileName)
使用 ACCESS_STREAMING模式打开assets下的指定文件。.

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

三、操作步骤

assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager类以字节流的形式读取文件。
操作步骤:
step1. 先在Activity里面获取AssetManager引用。
getAssets()

step2. 再用AssetManager的open方法则指定读取的文件以及访问模式就能得到输入流InputStream。
open(String fileName, int accessMode)

step3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得:
inputStream.close()

step4.关闭AssetManager。
AssetManager.close()

四、应用实例

1.加载assets目录下的网页:
//加载assets/win8_Demo/目录下的index.html网页
webView.loadUrl("file:///android_asset/win8_Demo/index.html");

说明:这种方式可以加载assets目录下的网页,并且与网页有关的css,js,图片等文件也会的加载。

2.访问assets目录下的资源文件:
AssetManager.open(String filename),
返回的是一个InputSteam类型的字节流,
这里的filename必须是文件比如(aa.txt;img/semll.jpg),而不能是文件夹。

3.获取assets的文件及目录名:
//获取assets目录下的所有文件及目录名,content(当前的上下文如Activity,Service等ContextWrapper的子类的都可以)
String fileNames[] =context.getAssets().list(path);

4.将assets下的文件复制到SD卡:
/**
* 从assets目录中复制整个文件夹内容
* @param context Context 使用CopyFiles类的Activity
* @param oldPath String 原文件路径 如:/aa
* @param newPath String 复制后路径 如:xx:/bb/cc
*/
public void copyFilesFassets(Context context,String oldPath,String newPath) {
try {
String fileNames[] = context.getAssets().list(oldPath);//获取assets目录下的所有文件及目录名
if (fileNames.length > 0) {//如果是目录
File file = new File(newPath);
file.mkdirs();//如果文件夹不存在,则递归
for (String fileName : fileNames) {
copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);
}
} else {//如果是文件
InputStream is = context.getAssets().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();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//如果捕捉到错误则通知UI线程
MainActivity.handler.sendEmptyMessage(COPY_FALSE);
}
}

5.使用assets目录下的图片资源:
InputStream is=getAssets().open("wpics/0ZR424L-0.jpg");
Bitmap bitmap=BitmapFactory.decodeStream(is);
imgShow.setImageBitmap(bitmap);

需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作

6. 从resource的raw中读取文件数据:
String res = "";
try{
//得到资源中的Raw数据流
InputStream in = getResources().openRawResource(R.raw.test);

//得到数据的大小
int length = in.available();

byte [] buffer = new byte[length];

//读取数据
in.read(buffer);

//依test.txt的编码类型选择合适的编码,如果不调整会乱码
res = EncodingUtils.getString(buffer, "BIG5");

//关闭
in.close();

}catch(Exception e){
e.printStackTrace();
}




7. 从resource的asset中读取文件数据
String fileName = "test.txt"; //文件名字
String res="";
try{
//得到资源中的asset数据流
InputStream in = getResources().getAssets().open(fileName);

int length = in.available();
byte [] buffer = new byte[length];

in.read(buffer);
in.close();
res = EncodingUtils.getString(buffer, "UTF-8");

}catch(Exception e){
e.printStackTrace();
}

更多相关文章

  1. Android(安卓)-- 工程目录解释
  2. Android中 在显示ImageView时图片上面和下面都出现一段空白区间
  3. PC_android通信之传输图片并显示在手机端
  4. Linux 下Android(安卓)开发环境搭建
  5. Android之內置、外置SDCard
  6. libcurl库编译生成不带版本的设置方法
  7. 文件修改如何简单修改Android的so文件
  8. 【整理】Android对Linux内核的改动你知道多少?
  9. 初学Android,使用Drawable资源之使用StateListDrawable资源(十三

随机推荐

  1. java.lang.UnsatisfiedLinkError: dlopen
  2. 感觉比较好的学习Android网站
  3. Basic4android 1.8,用 Basic 编写 Android
  4. Android内置倒计时类CountDownTimer
  5. android中得到颜色,图片资源的方式
  6. Android 升级ADT后,NoClassDefFoundError
  7. Android,使用Intent或Bundle传递参数,跳转
  8. android之uniapp原生打包
  9. Android 判断app是否正在播放音乐
  10. Android:自定义ImageView展示大图中的指定