zoukankan      html  css  js  c++  java
  • 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(" ");  
    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(" ");  
    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");获得文件的输入流就可以。


  • 相关阅读:
    考研408大纲梳理(持续更新)
    学习就是把抽象变具体,模糊变清楚,组合件拆单件的过程。
    20210402学习笔记---眼看这是要浪费一下午?(要放假了心里跟长草似的 浮躁啥自己也不知道 假期不还是学习么)不行,赶紧学。
    20210401学习笔记--概念必须都弄懂,你可能很熟悉,但你却不知道他的定义、为什么用它不用别的,这个不清楚学习就很难。(另外学习要把握重点,已经会的都不需要记)
    20210401日记
    20210331日记
    20210330学习笔记--第1天目标是刷完HadoopDay1 Day2(计划40天学完大数据)
    20210330日记
    这个老的大数据视频,用的工具还是Eclipse,不照着视频做,就各种报错出问题,也不知道咋解决。还是买个新点的视频看。
    20210329学习笔记--看来得找个更新的视频课了(用IDEA),一步一步跟着做了,而且每天要定量,必须完成多少。目前进度完全不行。
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6727898.html
Copyright © 2011-2022 走看看