Android的xml/assets/raw资源使用具体解释
Posted yutingliuyl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
演示样例代码:
- AssetManager assetManager = getResources().getAssets(); //获取管理assets文件夹资源的AssetManager引用
- InputStream inputStream = assetManager .open("data.txt"); //获取assets/data.txt资源文件的输入流
- InputStreamReader inputReader = new InputStreamReader(inputStream);
- BufferedReader bufReader = new BufferedReader(inputReader);
- while((line = bufReader.readLine())!=null) //按行读取输入流数据
- result +=line;
- return result;
- 或者
- InputStream inputStream = getResources().getAssets().open("data.txt"); //获取assets/data.txt文件的输入流
- int length = inputStream.available(); //获取文件的字节数
- byte[] buffer = new byte[length ]; //创建length大小byte字节数组
- inputStream.read(buffer); //将文件里的数据读到byte数组中
- String result = EncodingUtils.getString(buffer,"UTF-8"); //获得字符串数据
2.res/raw资源文件夹:raw文件夹下存放的资源代表应用无法直接訪问的原生资源,这些文件将原封不动的存储到设备上,不会被编译为二进制形式,应用通过资源ID(R清单类索引项)訪问raw文件夹下的资源。应用程序使用openRawResource以的字节流的形式来读取资源文件,raw不支持多级子文件夹。
演示样例代码:
- InputStreamReader inputReader = new InputStreamReader(getResources().openRawResource("data.txt"));
- BufferedReader bufReader = new BufferedReader(inputReader);
- while((line = bufReader.readLine())!=null) //按行读取输入流数据
- result +=line;
- 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>
演示样例代码:
- XmlResourceParser xmlParser = getResource().getXml(R.xml.persons);
- //获得res/xml/data.xml相应 XmlResourceParser解析器引用
- StringBuilder sb = new StringBuilder("");
- while(xmlParser.getEventType() != XmlPullParser.END_DOCUMENT){ //是否读取到XML文档结束推断
- if(xmlParser.getEventType() == XmlPullParser.START_TAG){ //遇到開始标签
- String tagName = xmlParser.getName(); //获得标签名
- if(tagName.equals("person")){ //依据标签名获取相应的属性
- String personAge = xmlParser.getAttributeValue(null,"age");//依据属性名来获取属性值
- String personSex = xmlParser.getAttributeValue(1); //依据属性名来获取属性值
- String person = xmlParser.nextText(); //获取文本结点的值
- String onePerson = "姓名:"+person+"性别:"+personSex+"age:"+personAge ;
- sb.append(onePerson );
- }
- sb.append("\n");
- }
- xmlParser.next(); //获取解析器的下一个事件
- }
- System.out.println(sb.toString());
- }
得到的结果为:
总结: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
- package com.example.assetsresource;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.Reader;
- import org.apache.http.util.EncodingUtils;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import android.app.Activity;
- import android.content.res.AssetManager;
- import android.content.res.XmlResourceParser;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- /**
- * 项目名称/版本:assetsResource/v1.0
- * 包 名:com.example.assetsresource
- * 类描写叙述:解析assets、xml、raw文件夹下文件
- * 创建人:jiangdongguo 创建时间:2015-6-3 下午11:12:47
- * 博客地址:http://blog.csdn.net/u012637501
- */
- public class MainActivity extends Activity {
- private Button xmlBtn = null;
- private Button rawBtn = null;
- private Button assetsBtn = null;
- private TextView context = null;
- private void init() {
- xmlBtn = (Button) findViewById(R.id.parserXML);
- rawBtn = (Button) findViewById(R.id.parserRaw);
- assetsBtn = (Button) findViewById(R.id.parserAssets);
- myClickListener listener = new myClickListener();
- xmlBtn.setOnClickListener(listener);
- rawBtn.setOnClickListener(listener);
- assetsBtn.setOnClickListener(listener);
- context = (TextView) findViewById(R.id.text);
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- init();
- }
- /**
- * 内部类描写叙述:内部类实现事件监听器 博客地址:http://blog.csdn.net/u012637501
- */
- class myClickListener implements OnClickListener {
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.parserAssets:
- AssetManager asset = getResources().getAssets(); // 获得assets工具类AssetManager引用
- try {
- InputStream inputStream = asset.open("data.txt"); // 获得assets文件夹下data.txt的输入流
- int length = inputStream.available(); // 获得输入流可读字节长度
- byte[] buffer = new byte[length];
- inputStream.read(buffer); // 从输入流读取buffer字节数据到buffer字节数组中
- String result = new String(buffer, "GB2312"); // 将字节数据转换成字符串数据
- context.setText(result); // 将assets文件夹下的data.txt数据显示到文本显示框中
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- case R.id.parserRaw:
- InputStream inputStream = getResources().openRawResource(
- R.raw.skill); // 获得res/raw文件夹下的输入流
- int length;
- try {
- length = inputStream.available(); // 获得输入流可读字节长度
- byte[] buffer = new byte[length];
- inputStream.read(buffer); // 从输入流读取buffer字节数据到buffer字节数组中
- String result = new String(buffer, "GB2312"); // 将字节数据转换成字符串数据
- context.setText(result); // 将assets文件夹下的data.txt数据显示到文本显示框中
- break;
- } catch (IOException e) {
- e.printStackTrace();
- }
- case R.id.parserXML:
- XmlResourceParser xmlParser = getResources().getXml(R.xml.persons); // 获得res/xml文件夹下的输入流
- try {
- StringBuilder sb = new StringBuilder();
- while(xmlParser.getEventType() != XmlPullParser.END_DOCUMENT){ //是否读取到XML文档结束推断
- if(xmlParser.getEventType() == XmlPullParser.START_TAG){ //遇到開始标签
- String tagName = xmlParser.getName(); //获得标签名
- if(tagName.equals("person")){ //依据标签名获取相应的属性
- String personAge = xmlParser.getAttributeValue(null,"age");//依据属性名来获取属性值
- String personSex = xmlParser.getAttributeValue(1); //依据属性名来获取属性值
- String person = xmlParser.nextText(); //获取文本结点的值
- String onePerson = "姓名:"+person+"性别:"+personSex+"age:"+personAge ;
- sb.append(onePerson );
- }
- sb.append("\n");
- }
- xmlParser.next(); //获取解析器的下一个事件
- }
- context.setText(sb.toString());
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- default:
- break;
- }
- }
- }
- }
布局文件main.xml例如以下:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="60dp">
- <Button
- android:id="@+id/parserXML"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:text="解析xml"/>
- <Button
- android:id="@+id/parserAssets"
- android:layout_centerInParent="true"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:text="解析assets"/>
- <Button
- android:id="@+id/parserRaw"
- android:layout_alignParentRight="true"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:text="解析raw"/>
- </RelativeLayout>
- <!--文本显示卡滚动显示-->
- <ScrollView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:id="@+id/text"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- </ScrollView>
- </LinearLayout>
另外,假设我们须要获得assets文件夹下的全部文件,如图片资源。能够这样做:
- int currentImage=0;
- InputStream inputStream = null;
- AssetManager assetManager = getResources().getAssets();
- String[] images = assetManager.list("");//获取assets/myImages文件夹以下全部的文件名称称
- public void nextBtn(View v){
- //防止数组越界处理
- if(currentImage>=images.length){
- currentImage = 0;
- }
- //依据文件名称获得相应的输入流
- inputStream=assetManager.open(images[currentImage++]);
- //假设图片还未回收,先强制回收该图片
- BitmapDrawable bitmapDrawable = (BitmapDrawable)imageView.getDrawable();
- if(bitmapDrawable !=null && !bitmapDrawable.getBitmap().isRecycled()){
- bitmapDrawable.getBitmap().recycle();
- }
- //编码输入流,获得图片
- imageView.setImageBitmap(BitmapFactory.decodeStream(inputStream));
- //关闭输入流
- inputStream.close();
- }
总结: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 Lollipop 中状态栏的工具栏颜色变暗
Android 开发学习进程0.17 Android资源文件selector textview显示两种不同字体
React Native InApp浏览器-选择要上传的文件(文件资源管理器),使InApp浏览器仅通过Google Chrome关闭