Blogger Scott

          android三個(gè)特殊的資源目錄 /res/xml /res/raw 和 /assets

          在android開(kāi)發(fā)中,我們離不開(kāi)資源文件的使用,從drawable到string,再到layout,這些資源都為我們的開(kāi)發(fā)提供了極大的便利,不過(guò)我們平時(shí)大部分時(shí)間接觸的資源目錄一般都是下面這三個(gè)。

          /res/drawable
          /res/values
          /res/layout

          但android的資源文件并不止這些,下面就為大家介紹一下另外三個(gè)資源目錄

          /res/xml
          /res/raw
          /assets

          首先是/res/xml ,這個(gè)目錄中大家可能偶爾用到過(guò),這里可以用來(lái)存儲(chǔ)xml格式的文件,并且和其他資源文件一樣,這里的資源是會(huì)被編譯成二進(jìn)制格式放到最終的安裝包里的,我們也可以通過(guò)R類(lèi)來(lái)訪問(wèn)這里的文件,并且解析里面的內(nèi)容,例如我們?cè)谶@里存放了一個(gè)名為data.xml的文件:

          <?xml version="1.0" encoding="utf-8"?>
          <root>
                  <title>Hello XML!</title>
          </root>
          復(fù)制代碼
          隨后,我們就可以通過(guò)資源ID來(lái)訪問(wèn)并解析這個(gè)文件了:

                  
          XmlResourceParser xml = getResources().getXml(R.xml.data);
          xml.next();
          int eventType = xml.getEventType();
          boolean inTitle = false;
          while(eventType != XmlPullParser.END_DOCUMENT) {
                  
                  //到達(dá)title節(jié)點(diǎn)時(shí)標(biāo)記一下
                  if(eventType == XmlPullParser.START_TAG) {
                          if(xml.getName().equals("title")) {
                                  inTitle = true;
                          }
                  }
                  
                  //如過(guò)到達(dá)標(biāo)記的節(jié)點(diǎn)則取出內(nèi)容
                  if(eventType == XmlPullParser.TEXT && inTitle) {
                          ((TextView)findViewById(R.id.txXml)).setText(
                                          xml.getText()
                          );
                  }
                  
                  xml.next();
                  eventType = xml.getEventType();
          }
          復(fù)制代碼
          在這里,我們用資源類(lèi)的getXml方法,返回了一個(gè)xml解析器,這個(gè)解析器的工作原理和SAX方式差不多,有關(guān)SAX的具體細(xì)節(jié)可以看看我的另一篇帖子:
          http://www.eoeandroid.com/thread-33212-1-1.html

                  要注意的是,這里的xml文件,最終是會(huì)被編譯成二進(jìn)制形式的,如果大家想讓文件原樣存儲(chǔ)的話,那么就要用到下一個(gè)目錄啦,那就是/res/raw目錄
                 
                  這個(gè)目錄的唯一區(qū)別就是,這里的文件會(huì)原封不動(dòng)的存儲(chǔ)到設(shè)備上,不會(huì)被編譯為二進(jìn)制形式,訪問(wèn)的方式也是通過(guò)R類(lèi),下面是一個(gè)例子:

                  
                  ((TextView)findViewById(R.id.txRaw)).setText(
                          readStream(getResources().openRawResource(R.raw.rawtext))   
                  );
                  
                  private String readStream(InputStream is) {
                         
                          try {
                                  ByteArrayOutputStream bo = new ByteArrayOutputStream();
                                  int i = is.read();
                                  while(i != -1) {
                                          bo.write(i);
                                          i = is.read();
                                  }
                                  
                                  return bo.toString();
                          } catch (IOException e) {
                                  return "";
                          }
                  }
          復(fù)制代碼
          這次使用資源類(lèi)中的方法,openRawResource,返回給我們一個(gè)輸入流,這樣我們就可以任意讀取文件中的內(nèi)容了,例如上面例子中那樣,原樣輸出文本文件中的內(nèi)容。
                 
                  當(dāng)然,如果你需要更高的自由度,盡量不受android平臺(tái)的約束,那么/assets這個(gè)目錄就是你的首選了~
                  這個(gè)目錄中的文件除了不會(huì)被編譯成二進(jìn)制形式之外,另外一點(diǎn)就是,訪問(wèn)方式是通過(guò)文件名,而不是資源ID。并且還有更重要的一點(diǎn)就是,大家可以在這里任意的建立子目錄,而/res目錄中的資源文件是不能自行建立子目錄的。如果需要這種靈活的資源存儲(chǔ)方式,那么就看看下面這個(gè)例子:

                  
                  AssetManager assets = getAssets();
                  
                  ((TextView)findViewById(R.id.txAssets)).setText(
                          readStream(assets.open("data.txt"))
                  );
          復(fù)制代碼
          在context上下文中,調(diào)用getAssets返回一個(gè)AssetManager,然后使用open方法就可以訪問(wèn)需要的資源了,這里open方法是以assets目錄為根的。所以上面這段代碼訪問(wèn)的是assets目錄中名為data.txt的資源文件~
                 
                  這三個(gè)目錄中我們平時(shí)開(kāi)發(fā)應(yīng)用的時(shí)候,還是很實(shí)用的,這里發(fā)給大家,希望能對(duì)大家在開(kāi)發(fā)應(yīng)用時(shí)有所幫助~

           

          本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/shichexixi/archive/2010/11/03/5985683.aspx

          posted on 2010-12-05 00:00 江天部落格 閱讀(1777) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Android

          主站蜘蛛池模板: 自贡市| 资中县| 安溪县| 正宁县| 阳曲县| 平安县| 延吉市| 松江区| 都江堰市| 丰县| 许昌市| 时尚| 奉化市| 阿坝县| 阿合奇县| 米易县| 通化市| 甘南县| 临颍县| 博白县| 蓬溪县| 南阳市| 湘潭市| 新密市| 富裕县| 长春市| 南宫市| 盐池县| 尼玛县| 恩施市| 乌拉特后旗| 宣威市| 兴山县| 阿拉尔市| 新晃| 县级市| 西城区| 奉化市| 修水县| 布尔津县| 新巴尔虎左旗|