码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-06-04 15:53:09      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:android   应用   

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

标签:android   应用   

原文地址:http://blog.csdn.net/u012637501/article/details/46360063

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!