2011年4月29日 星期五

android /res/xml /res/raw /assets

在android開發中,我們離不開資源文件的使用,從drawable到string,再到layout,這些資源都為我們的開發提供了極大的便利,不過我們平時大部分時間接觸的資源目錄一般都是下面這三個。
/res/drawable
/res/values
/res/layout


但android的資源文件並不止這些,下面就為大家介紹一下另外三個資源目錄
/res/xml                                                        
/res/raw                                                       
/assets                                                         
首先是/res/xml ,這個目錄中大家可能偶爾用到過,這裡可以用來存儲xml格式的文件,並且和其他資源文件一樣,這裡的資源是會被編譯成二進制格式放到最終的安裝包裡的,我們也可以通過R類來訪問這裡的文件,並且解析裡面的內容,例如我們在這裡存放了一個名為data.xml的文件:
<?xml version="1.0" encoding="utf-8"?>
<root>
        <title>Hello XML!</title>
</root>
複製代碼
隨後,我們就可以通過資源ID來訪問並解析這個文件了:
        
XmlResourceParser xml = getResources().getXml(R.xml.data);
xml.next();
int eventType = xml.getEventType();
boolean inTitle = false;
while(eventType != XmlPullParser.END_DOCUMENT) {
        
        //到達title節點時標記一下
        if(eventType == XmlPullParser.START_TAG) {
                if(xml.getName().equals("title")) {
                        inTitle = true;
                }
        }
        
        //如過到達標記的節點則取出內容
        if(eventType == XmlPullParser.TEXT && inTitle) {
                ((TextView)findViewById(R.id.txXml)).setText(
                                xml.getText()
                );
        }
        
        xml.next();
        eventType = xml.getEventType();
}
複製代碼
在這裡,我們用資源類的getXml方法,返回了一個xml解析器,這個解析器的工作原理和SAX方式差不多,有關SAX的具體細節可以看看我的另一篇帖子:
http://www.eoeandroid.com/thread-33212-1-1.html
        要注意的是,這裡的xml文件,最終是會被編譯成二進制形式的,如果大家想讓文件原樣存儲的話,那麼就要用到下一個目錄啦,那就是/res/raw目錄
       
        這個目錄的唯一區別就是,這裡的文件會原封不動的存儲到設備上,不會被編譯為二進制形式,訪問的方式也是通過R類,下面是一個例子:
        
        ((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 "";
                }
        }
複製代碼
這次使用資源類中的方法,openRawResource,返回給我們一個輸入流,這樣我們就可以任意讀取文件中的內容了,例如上面例子中那樣,原樣輸出文本文件中的內容。
       
        當然,如果你需要更高的自由度,盡量不受android平台的約束,那麼/assets這個目錄就是你的首選了~
        這個目錄中的文件除了不會被編譯成二進制形式之外,另外一點就是,訪問方式是通過文件名,而不是資源ID。並且還有更重要的一點就是,大家可以在這裡任意的建立子目錄,而/res目錄中的資源文件是不能自行建立子目錄的。如果需要這種靈活的資源存儲方式,那麼就看看下面這個例子:
        
        AssetManager assets = getAssets();
        
        ((TextView)findViewById(R.id.txAssets)).setText(
                readStream(assets.open("data.txt"))
        );
複製代碼
在context上下文中,調用getAssets返回一個AssetManager,然後使用open方法就可以訪問需要的資源了,這裡open方法是以assets目錄為根的。所以上面這段代碼訪問的是assets目錄中名為data.txt的資源文件~

參考 : http://blog.csdn.net/shichexixi/archive/2010/11/03/5985683.aspx

沒有留言:

張貼留言