一、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. }
 

得到的结果为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

总结: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.效果演示


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:16px; line-height:24px">


(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");获得文件的输入流就可以。


Android的xml/assets/raw资源使用具体解释的更多相关文章

  1. assets raw 资源 AssetManager

    assets raw 目录简介 assets核心特性:不会被编译成二进制,支持子目录(可以分类,这是相对raw目录最大的好处),通过文件名访问,调用getAssets通过AssetManager访问 ...

  2. Android开发 MediaPlayer播放raw资源MP3文件

    代码 private MediaPlayer mRingPlayer; /** * 播放铃声 */ private void startRing(){ if (mRingPlayer != null) ...

  3. 三个特殊资源目录 /res/xml /res/raw 和 /assets

    在android开发中,我们离不开资源文件的使用,从drawable到string,再到layout,这些资源都为我们的开发提供了极大的便利,不过我们平时大部分时间接触的资源目录一般都是下面这三个. ...

  4. android工程下assets与raw文件夹

    在应用的开发中,当我们创建一个新的Android工程后,我们会发现工程中包含了一个目录assets,另外当我们察看一些示例工程的时候,有时会发现在该工程的资源目录下会有一个raw目录(res/raw) ...

  5. Android Studio增加assets目录、raw目录

    assets与res/raw不同 assets目录是Android的一种特殊目录,用于放置APP所需的固定文件,且该文件被打包到APK中时,不会被编码到二进制文件. Android还存在一种放置在re ...

  6. android 各种xml资源的引用方式

    更多资源类型 本页定义了其它一些具体的资源类型,包括: Bool 存放布尔值的XML资源. Color 存放颜色值的XML资源(十六进制颜色). Dimension 存放数量值的XML资源(带计量单位 ...

  7. Android开发---如何操作资源目录中的资源文件4 ---访问xml的配置资源文件的内容

    Android开发---如何操作资源目录中的资源文件4 XML,位于res/xml/,这些静态的XML文件用于保存程序的数据和结构. XmlPullParser可以用于解释xml文件 效果图: 描述: ...

  8. Xamarin.Android 如何使用Assets目录下的文件

    原文:Xamarin.Android 如何使用Assets目录下的文件 个人原创,转载注明出处:http://blog.csdn.net/supluo/article/details/43672411 ...

  9. Android通过xml文件配置数据库

    之前一段时间自己封装了两个数据库,一个是ORM数据库,另一个是事件流数据库,项目相应的地址如下: ORM数据库:https://github.com/wenjiang/SimpleAndroidORM ...

随机推荐

  1. JVM -XX: 参数介绍

    功能开关: 参数 默认值或限制 说明 参数 默认值 功能 -XX:-AllowUserSignalHandlers 限于Linux和Solaris,默认不启用 允许为java进程安装信号处理器,信号处 ...

  2. h264 封装 RTMP中FLV数据的解析 rtmp协议简单解析以及用其发送h264的flv文件

    一个完整的多媒体文件是由音频和视频2部分组成的.H264.Xvid等就是视频编码格式,MP3.AAC等就是音频编码格式.字幕文件只是其中附带部分. 把视频编码和音频编码打包成一个完整的多媒体文件,可以 ...

  3. UVa 637 - Booklet Printing

    题目:模拟输出n页书的装订打印状态. 分析:模拟.页数为(n+3)/ 4,仅仅有n不超过半篇时会输出半篇. 说明:好多曾经做过的题目(⊙_⊙). #include <cstdlib> #i ...

  4. 重装Windows系统后,Mysql的恢复

    在原地直接恢复MySQL的自动启动的数据库服务,操作如下. (1)环境变量里配置一下Mysql的bin目录 (2)管理员方式启动cmd,运行命令mysqld –install (3)启动Mysql服务 ...

  5. JSON数据转换成table表格

    <%@ page contentType="text/html; charset=UTF-8" %> <%@taglib uri="/struts-ta ...

  6. 在上已个Java Spring MVC项目基础上加MyBatis

    代码目录: /Users/baidu/Documents/Data/Work/Code/Self/HelloSpringMVC 1. 首先在resource目录加上jdbc.properties: d ...

  7. Orchard运用 - 如何隐藏去除某些Meta标记

    众所周知,每个系统多多少少都会有一些痕迹或标记之类的东西, 比如默认的Orchard搭建的网站, 如果你查看源代码即可看到类似的代码: <meta content="Orchard&q ...

  8. java页面url传值中文编码&解码

    URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码. 这将涉及到字符解码操作,我们在应用中常常会用new String(fieldType.ge ...

  9. 使用mocha测试

    学习了MOCHA官网的示例,将学习成果记录一下.[原文+例子:使用mocha测试] mocha是什么 Mocha是一个跑在node和浏览器上的javascript测试框架,让异步测试变得简单有趣, 并 ...

  10. 再谈Cognos利用FM模型来做同比环比

    很早之前已经讲过 <Cognos利用DMR模型开发同比环比>这篇文章里说的是不利用过滤器,而是采用 except (lastPeriods (-9000,[订单数据分析].[日期维度].[ ...