Android的xml/assets/raw资源使用详解

一、assets/xml/raw资源介绍

1.assets资源目录:assets目录下存放的资源代表应用无法直接访问的原生资源,这些文件将原封不动的存储到设备上,不会被编译为二进制形式,访问方式是通过文件名而不是资源ID。应用程序通过AssetManager以的字节流的形式来读取资源文件。assets与res/raw的区别是assets支持任意深度的子目录,这些资源文件不会生成任何资源ID。Android应用访问assets文件夹资源步骤如下:

(1)先在Activity中调用getAssets()来获取AssetManager引用;

(2)再用AssetManger的open(String fileName,int accessMode)方法指定读取的文件以及访问模式,从而得到文件的输入流InputStream。需要注意的是,fileName不能是目录。

(3)从输入流InputStream中读取数据,读取完成后关闭输入流(close());

(4)调用AssetManager.close()关闭AssetManager

示例代码:

  1. AssetManager assetManager = getResources().getAssets();  //获取管理assets目录资源的AssetManager引用
  2. InputStream inputStream =  assetManager .open("data.txt");  //获取assets/data.txt资源文件的输入流
  3. InputStreamReader inputReader = new InputStreamReader(inputStream);
  4. BufferedReader bufReader = new BufferedReader(inputReader);
  5. while((line = bufReader.readLine())!=null)        //按行读取输入流数据
  6. result +=line;
  7. return result;
  8. 或者
  9. InputStream inputStream = getResources().getAssets().open("data.txt");    //获取assets/data.txt文件的输入流
  10. int length = inputStream.available();                //获取文件的字节数
  11. byte[] buffer = new byte[length ];                  //创建length大小byte字节数组
  12. inputStream.read(buffer);                                //将文件中的数据读到byte数组中
  13. String result = EncodingUtils.getString(buffer,"UTF-8");    //获得字符串数据

2.res/raw资源目录:raw目录下存放的资源代表应用无法直接访问的原生资源,这些文件将原封不动的存储到设备上,不会被编译为二进制形式,应用通过资源ID(R清单类索引项)访问raw目录下的资源。应用程序使用openRawResource以的字节流的形式来读取资源文件,raw不支持多级子目录。

示例代码:

  1. InputStreamReader inputReader = new InputStreamReader(getResources().openRawResource("data.txt"));
  2. BufferedReader bufReader = new BufferedReader(inputReader);
  3. while((line = bufReader.readLine())!=null)        //按行读取输入流数据
  4. result +=line;
  5. return result;

3.res/xml资源目录:该目录用于存储通用的XML格式文件,同/res/drawable资源一样,xml资源将会被编译成二进制格式存放到最终的安装包里。xml目录不支持多级子目录,在开发中可以通过R类来访问这些文件资源并且解析里面的内容。

XML资源的内容如下res/xml/persons.xml:

<?xml version="1.0"  encoding="UTF-8"?>

<persons>

<person age="100"  性别="男">张三</person>

<person age="23"  性别="男">李四</person>

<person age="44"  性别="女">王五</person>

<person age="78"  性别="男">赵六</person>

</persons>

示例代码:

  1. XmlResourceParser xmlParser = getResource().getXml(R.xml.persons);
  2. //获得res/xml/data.xml对应 XmlResourceParser解析器引用
  3. StringBuilder sb = new StringBuilder("");
  4. while(xmlParser.getEventType() != XmlPullParser.END_DOCUMENT){ //是否读取到XML文档结束判断
  5. if(xmlParser.getEventType() == XmlPullParser.START_TAG){  //遇到开始标签
  6. String tagName = xmlParser.getName();   //获得标签名
  7. if(tagName.equals("person")){   //根据标签名获取对应的属性
  8. String personAge =  xmlParser.getAttributeValue(null,"age");//根据属性名来获取属性值
  9. String personSex = xmlParser.getAttributeValue(1);          //根据属性名来获取属性值
  10. String person = xmlParser.nextText();    //获取文本结点的值
  11. String onePerson = "姓名:"+person+"性别:"+personSex+"age:"+personAge ;
  12. sb.append(onePerson );
  13. }
  14. sb.append("\n");
  15. }
  16. xmlParser.next();     //获取解析器的下一个事件
  17. }
  18. System.out.println(sb.toString());
  19. }

得到的结果为:

总结:PULL解析器是一个开源项目,Android平台已经内置了PULL解析器,同时Android系统本身也是使用PULL解析器来解析各种XML文档。 PULL解析XML文件时,回调XmlResourceParser内定义表示文档开头结束和节点开头结束的数值(事件回调类型),表示如下:

a.读取到XML文档开头(声明)返回:XmlPullParser.START_DOCUMENT

b.读取到XML文档结束返回:XmlPullParser.END_DOCUMENT

c.读取到XML节点开始返回:XmlPullParser.START_TAG

d.读取到XML节点结束返回:XmlPullParser.END_TAG

e.读取到XML文本返回:XmlPullParser.TEXT

XmlPullParser有几个主要方法:

a.XmlPullParser.getEventType() :获取当前事件回调类型

b.XmlPullParser.getName():获取当前节点名字

c.XmlPullParser.getAttributeValue(int index):根据id获取节点属性值

d.XmlPullParser.getAttributeValue(String namespace, String name):根据name获取节点属性值

e.XmlPullParser.netxText():回调节点START_TAG时,通过此方法获取节点内容

二、源码实战

1.效果演示



(2)源码MainActivity.java

  1. package com.example.assetsresource;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.Reader;
  5. import org.apache.http.util.EncodingUtils;
  6. import org.xmlpull.v1.XmlPullParser;
  7. import org.xmlpull.v1.XmlPullParserException;
  8. import android.app.Activity;
  9. import android.content.res.AssetManager;
  10. import android.content.res.XmlResourceParser;
  11. import android.os.Bundle;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14. import android.widget.Button;
  15. import android.widget.TextView;
  16. /**
  17. * 项目名称/版本号:assetsResource/v1.0
  18. * 包 名:com.example.assetsresource
  19. * 类描述:解析assets、xml、raw目录下文件
  20. * 创建人:jiangdongguo 创建时间:2015-6-3 下午11:12:47
  21. * 博客地址:http://blog.csdn.net/u012637501
  22. */
  23. public class MainActivity extends Activity {
  24. private Button xmlBtn = null;
  25. private Button rawBtn = null;
  26. private Button assetsBtn = null;
  27. private TextView context = null;
  28. private void init() {
  29. xmlBtn = (Button) findViewById(R.id.parserXML);
  30. rawBtn = (Button) findViewById(R.id.parserRaw);
  31. assetsBtn = (Button) findViewById(R.id.parserAssets);
  32. myClickListener listener = new myClickListener();
  33. xmlBtn.setOnClickListener(listener);
  34. rawBtn.setOnClickListener(listener);
  35. assetsBtn.setOnClickListener(listener);
  36. context = (TextView) findViewById(R.id.text);
  37. }
  38. @Override
  39. protected void onCreate(Bundle savedInstanceState) {
  40. super.onCreate(savedInstanceState);
  41. setContentView(R.layout.main);
  42. init();
  43. }
  44. /**
  45. * 内部类描述:内部类实现事件监听器 博客地址:http://blog.csdn.net/u012637501
  46. */
  47. class myClickListener implements OnClickListener {
  48. public void onClick(View v) {
  49. switch (v.getId()) {
  50. case R.id.parserAssets:
  51. AssetManager asset = getResources().getAssets(); // 获得assets工具类AssetManager引用
  52. try {
  53. InputStream inputStream = asset.open("data.txt"); // 获得assets目录下data.txt的输入流
  54. int length = inputStream.available(); // 获得输入流可读字节长度
  55. byte[] buffer = new byte[length];
  56. inputStream.read(buffer); // 从输入流读取buffer字节数据到buffer字节数组中
  57. String result = new String(buffer, "GB2312"); // 将字节数据转换成字符串数据
  58. context.setText(result); // 将assets目录下的data.txt数据显示到文本显示框中
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }
  62. break;
  63. case R.id.parserRaw:
  64. InputStream inputStream = getResources().openRawResource(
  65. R.raw.skill); // 获得res/raw目录下的输入流
  66. int length;
  67. try {
  68. length = inputStream.available(); // 获得输入流可读字节长度
  69. byte[] buffer = new byte[length];
  70. inputStream.read(buffer); // 从输入流读取buffer字节数据到buffer字节数组中
  71. String result = new String(buffer, "GB2312"); // 将字节数据转换成字符串数据
  72. context.setText(result); // 将assets目录下的data.txt数据显示到文本显示框中
  73. break;
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. }
  77. case R.id.parserXML:
  78. XmlResourceParser xmlParser = getResources().getXml(R.xml.persons); // 获得res/xml目录下的输入流
  79. try {
  80. StringBuilder sb = new StringBuilder();
  81. while(xmlParser.getEventType() != XmlPullParser.END_DOCUMENT){  //是否读取到XML文档结束判断
  82. if(xmlParser.getEventType() == XmlPullParser.START_TAG){                //遇到开始标签
  83. String tagName = xmlParser.getName();               //获得标签名
  84. if(tagName.equals("person")){                               //根据标签名获取对应的属性
  85. String personAge =  xmlParser.getAttributeValue(null,"age");//根据属性名来获取属性值
  86. String personSex = xmlParser.getAttributeValue(1);          //根据属性名来获取属性值
  87. String person = xmlParser.nextText();    //获取文本结点的值
  88. String onePerson = "姓名:"+person+"性别:"+personSex+"age:"+personAge ;
  89. sb.append(onePerson );
  90. }
  91. sb.append("\n");
  92. }
  93. xmlParser.next();       //获取解析器的下一个事件
  94. }
  95. context.setText(sb.toString());
  96. } catch (XmlPullParserException e) {
  97. e.printStackTrace();
  98. } catch (IOException e) {
  99. e.printStackTrace();
  100. }
  101. break;
  102. default:
  103. break;
  104. }
  105. }
  106. }
  107. }

布局文件main.xml如下:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <RelativeLayout
  7. android:layout_width="fill_parent"
  8. android:layout_height="60dp">
  9. <Button
  10. android:id="@+id/parserXML"
  11. android:layout_width="wrap_content"
  12. android:layout_height="fill_parent"
  13. android:text="解析xml"/>
  14. <Button
  15. android:id="@+id/parserAssets"
  16. android:layout_centerInParent="true"
  17. android:layout_width="wrap_content"
  18. android:layout_height="fill_parent"
  19. android:text="解析assets"/>
  20. <Button
  21. android:id="@+id/parserRaw"
  22. android:layout_alignParentRight="true"
  23. android:layout_width="wrap_content"
  24. android:layout_height="fill_parent"
  25. android:text="解析raw"/>
  26. </RelativeLayout>
  27. <!--文本显示卡滚动显示-->
  28. <ScrollView
  29. android:layout_width="fill_parent"
  30. android:layout_height="fill_parent">
  31. <TextView
  32. android:id="@+id/text"
  33. android:layout_width="fill_parent"
  34. android:layout_height="wrap_content"/>
  35. </ScrollView>
  36. </LinearLayout>

另外,如果我们需要获得assets目录下的所有文件,如图片资源,可以这样做:

  1. int currentImage=0;
  2. InputStream inputStream = null;
  3. AssetManager assetManager = getResources().getAssets();
  4. String[] images = assetManager.list("");//获取assets/myImages目录下面所有的文件名称
  5. public void nextBtn(View v){
  6. //防止数组越界处理
  7. if(currentImage>=images.length){
  8. currentImage = 0;
  9. }
  10. //根据文件名获得对应的输入流
  11. inputStream=assetManager.open(images[currentImage++]);
  12. //如果图片还未回收,先强制回收该图片
  13. BitmapDrawable bitmapDrawable = (BitmapDrawable)imageView.getDrawable();
  14. if(bitmapDrawable !=null && !bitmapDrawable.getBitmap().isRecycled()){
  15. bitmapDrawable.getBitmap().recycle();
  16. }
  17. //编码输入流,获得图片
  18. imageView.setImageBitmap(BitmapFactory.decodeStream(inputStream));
  19. //关闭输入流
  20. inputStream.close();
  21. }

总结:public final String[]list(String path),返回当前目录下面的所有文件以及子目录的名称。可以通过递归遍历整个文件目录,实现所有资源文件的访问。访问assets子目录下的某个资源方法:如String[] list=null;list=getResources().getAssets().list("abc");它返回的是在assets文件夹下abc文件夹中文件的文件名的列表。再去检查list中是否有你需要的文件。读取abc文件夹中的文件的时候只需:InputStreamin=getResources().getAssets().open("abc/yan.txt");获得文件的输入流即可。

时间: 2024-10-10 04:35:16

Android的xml/assets/raw资源使用详解的相关文章

Android的xml/assets/raw资源使用具体解释

一.assets/xml/raw资源介绍 1.assets资源文件夹:assets文件夹下存放的资源代表应用无法直接訪问的原生资源,这些文件将原封不动的存储到设备上,不会被编译为二进制形式,訪问方式是通过文件名称而不是资源ID.应用程序通过AssetManager以的字节流的形式来读取资源文件.assets与res/raw的差别是assets支持随意深度的子文件夹.这些资源文件不会生成不论什么资源ID. Android应用訪问assets文件夹资源过程例如以下: (1)先在Activity中调用

android中xml设置Animation动画效果详解

在 android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation 画面转换动画. tweened animation 渐变动画有以下两种类型: 1.alpha 渐变透明度动画效果 2.scale 渐变尺寸伸缩动画效果 frame by frame animation 画面转换动画有以下两种类型: 1.translate 画面转换位置移动动画效果 2.rotate

Android本地化资源目录详解

我们可以设想,有两个不同分辨率的手机(320*480和480*800)要使用一些图像资源,为了使图像不失真,就需要为不同分辨率的手机指定不同的图像,为此就需要建立不同的资源目录. 在res目录中建立了3个图像资源目录:drawable.drawable-hdpi和drawable-mdpi.其中drawable为默认图像的图像资源目录,drawable-hdpi保存了在高屏幕密度(指480*800或相似的分辨率)情况系使用的图像资源,drawable-mdpi保存了中屏幕密度(值320*480或

【Android】状态栏通知Notification、NotificationManager详解(转)

在Android系统中,发一个状态栏通知还是很方便的.下面我们就来看一下,怎么发送状态栏通知,状态栏通知又有哪些参数可以设置? 首先,发送一个状态栏通知必须用到两个类:  NotificationManager . Notification. NotificationManager :  是状态栏通知的管理类,负责发通知.清楚通知等. NotificationManager 是一个系统Service,必须通过 getSystemService()方法来获取. [java] view plainc

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.

Android研究之动态创建UI界面详解

 Android的基本UI界面一般都是在xml文件中定义好,然后通过activity的setContentView来显示在界面上,这是Android UI的最简单的构建方式.其实,为了实现更加复杂和更加灵活的UI界面,往往需要动态生成UI界面,甚至根据用户的点击或者配置,动态地改变UI,本文即介绍该技巧.对事件和进程的可能安卓设备实现触摸事件的监听,跨进程 假设Android工程的一个xml文件名为activity_main.xml,定义如下: 1 2 3 4 5 6 7 8 9 10 11

Android View 事件分发机制源码详解(View篇)

前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie

Qt on Android: Qt Quick 之 Hello World 图文详解

在上一篇文章,<Qt on Android:QML 语言基础>中,我们介绍了 QML 语言的语法,在最后我们遗留了一些问题没有展开,这篇呢,我们就正式开始撰写 Qt Quick 程序,而那些问题,随着本系列文章的展开也会一一被干掉. 在开始介绍 Qt Quick 应用的基本元素之前,我们先来创建一个 HelloQtQuickApp 项目,就是经典的 Hello World 了. 笔者的教程最终会面向 Qt Quick 与 C++ 混合编程,所以我们 HelloQtQuickApp 从零开始.

Android中自定义View、ViewGroup理论基础详解

Android自身提供了许多widgets,但是有时候这些widgets并不能满足我们的需求,这时我们就需要自定义View,本文会详细说明自定义View的各种理论基础,只有理解了这些知识,我们才能更好地实现各种功能的控件. 我觉得自定义View中最重要的部分就是绘图和交互,自定义的绘图使得你的View与众不同,交互使用户可以与你的View进行交互,而绘图的前提是View的量算与布局,交互的基础是触摸事件,所以量算.布局.绘图.触摸事件这些是自定义View的核心. 除此之外,一个设计友好的自定义V