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

來源:互聯網
上載者:User

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

      範例程式碼:
      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">
          7. android:id="@+id/parserXML"
            • android:layout_width="wrap_content"
            • android:layout_height="fill_parent"
            • android:text="解析xml"/>
            •  
            android:id="@+id/parserAssets"
            • android:layout_centerInParent="true"
            • android:layout_width="wrap_content"
            • android:layout_height="fill_parent"
            • android:text="解析assets"/>
            •  
            android:id="@+id/parserRaw"
            • android:layout_alignParentRight="true"
            • android:layout_width="wrap_content"
            • android:layout_height="fill_parent"
            • android:text="解析raw"/>
            •  
            • android:layout_width="fill_parent"
            • android:layout_height="fill_parent">
            • android:id="@+id/text"
            • android:layout_width="fill_parent"
            • android:layout_height="wrap_content"/>
            •  
            • 另外,如果我們需要獲得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");獲得檔案的輸入資料流即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.