Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android的xml/assets/raw資源使用詳解

Android的xml/assets/raw資源使用詳解

編輯:關於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: 張三 李四
      王五
      趙六


      示例代碼:
      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. }
        114. } 布局文件main.xml如下:
          1. xmlns:tools="http://schemas.android.com/tools"
          2. android:layout_width="match_parent"
          3. android:layout_height="match_parent"
          4. android:orientation="vertical">
          5. android:layout_width="fill_parent"
          6. android:layout_height="60dp">
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved