Android檔案資源(raw/data/asset)的存取

來源:互聯網
上載者:User

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

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


但android的資源檔並不止這些,下面就為大家介紹一下另外三個資來源目錄

/res/xml
/res/raw
/assets


首先是/res/xml ,這個目錄中大家可能偶爾用到過,這裡可以用來儲存xml格式的檔案,並且和其他資源檔一樣,這裡的資源是會被編譯成二進位格式放到最終的安裝包裡的,我們也可以通過R類來訪問這裡的檔案,並且解析裡面的內容,例如我們在這裡存放了一個名為data.xml的檔案:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <root>
  3.         <title>Hello XML!</title>
  4. </root>

複製代碼

隨後,我們就可以通過資源ID來訪問並解析這個檔案了:

  1.         
  2. XmlResourceParser xml = getResources().getXml(R.xml.data);
  3. xml.next();
  4. int eventType = xml.getEventType();
  5. boolean inTitle = false;
  6. while(eventType != XmlPullParser.END_DOCUMENT) {
  7.         
  8.         //到達title節點時標記一下
  9.         if(eventType == XmlPullParser.START_TAG) {
  10.                 if(xml.getName().equals("title")) {
  11.                         inTitle = true;
  12.                 }
  13.         }
  14.         
  15.         //如過到達標記的節點則取出內容
  16.         if(eventType == XmlPullParser.TEXT && inTitle) {
  17.                 ((TextView)findViewById(R.id.txXml)).setText(
  18.                                 xml.getText()
  19.                 );
  20.         }
  21.         
  22.         xml.next();
  23.         eventType = xml.getEventType();
  24. }

複製代碼

在這裡,我們用資源類的getXml方法,返回了一個xml解析器,這個解析器的工作原理和SAX方式差不多,有關SAX的具體細節可以看看我的另一篇文章:
http://www.eoeandroid.com/thread-33212-1-1.html

        要注意的是,這裡的xml檔案,最終是會被編譯成二進位形式的,如果大家想讓檔案原樣儲存的話,那麼就要用到下一個目錄啦,那就是/res/raw目錄
        
        這個目錄的唯一區別就是,這裡的檔案會原封不動的儲存到裝置上,不會被編譯為二進位形式,訪問的方式也是通過R類,下面是一個例子:

  1.         
  2.         ((TextView)findViewById(R.id.txRaw)).setText(
  3.                 readStream(getResources().openRawResource(R.raw.rawtext))   
  4.         );
  5.         
  6.         private String readStream(InputStream is) {
  7.                
  8.                 try {
  9.                         ByteArrayOutputStream bo = new ByteArrayOutputStream();
  10.                         int i = is.read();
  11.                         while(i != -1) {
  12.                                 bo.write(i);
  13.                                 i = is.read();
  14.                         }
  15.                         
  16.                         return bo.toString();
  17.                 } catch (IOException e) {
  18.                         return "";
  19.                 }
  20.         }

複製代碼

這次使用資源類中的方法,openRawResource,返回給我們一個輸入資料流,這樣我們就可以任意讀取檔案中的內容了,例如上面例子中那樣,原樣輸出文字檔中的內容。
        
        當然,如果你需要更高的自由度,盡量不受android平台的約束,那麼/assets這個目錄就是你的首選了~
        這個目錄中的檔案除了不會被編譯成二進位形式之外,另外一點就是,訪問方式是通過檔案名稱,而不是資源ID。並且還有更重要的一點就是,大家可以在這裡任意的建立子目錄,而/res目錄中的資源檔是不能自行建立子目錄的。如果需要這種靈活的資源儲存方式,那麼就看看下面這個例子:

  1.         
  2.         AssetManager assets = getAssets();
  3.         
  4.         ((TextView)findViewById(R.id.txAssets)).setText(
  5.                 readStream(assets.open("data.txt"))
  6.         );

複製代碼

在context上下文中,調用getAssets返回一個AssetManager,然後使用open方法就可以訪問需要的資源了,這裡open方法是以assets目錄為根的。所以上面這段代碼訪問的是assets目錄中名為data.txt的資源檔~
        
        這三個目錄中我們平時開發應用的時候,還是很實用的,這裡發給大家,希望能對大家在開發應用時有所協助~

 

 

 

Android檔案資源(raw/data/asset)的存取

 

一、私人檔案夾下的檔案存取(/data/data/包名)

Java代碼

  1. import java.io.FileInputStream;  
  2. import java.io.FileOutputStream;  
  3. import org.apache.http.util.EncodingUtils;  
  4.   
  5. public void writeFileData(String fileName,String message){  
  6.     try{  
  7.      FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);  
  8.      byte [] bytes = message.getBytes();  
  9.      fout.write(bytes);  
  10.       fout.close();  
  11.      }  
  12.     catch(Exception e){  
  13.      e.printStackTrace();  
  14.     }  
  15. }     
  16.   
  17.   
  18. public String readFileData(String fileName){  
  19.      String res="";  
  20.      try{  
  21.       FileInputStream fin = openFileInput(fileName);  
  22.       int length = fin.available();  
  23.       byte [] buffer = new byte[length];  
  24.       fin.read(buffer);      
  25.       res = EncodingUtils.getString(buffer, "UTF-8");  
  26.       fin.close();      
  27.      }  
  28.      catch(Exception e){  
  29.       e.printStackTrace();  
  30.      }  
  31.      return res;  
  32.     }    

 

 

二、從resource中的raw檔案夾中擷取檔案並讀取資料(資源檔只能讀不能寫)
   

Java代碼

  1. public String getFromRaw(String fileName){  
  2.     String res = "";  
  3.        try{  
  4.         InputStream in = getResources().openRawResource(R.raw.test1);   
  5.         int length = in.available();        
  6.         byte [] buffer = new byte[length];         
  7.         in.read(buffer);          
  8.         res = EncodingUtils.getString(buffer, "UTF-8");     
  9.         in.close();             
  10.        }  
  11.        catch(Exception e){  
  12.         e.printStackTrace();          
  13.        }  
  14.     return res ;  
  15.    }  

三、從asset中擷取檔案並讀取資料(資源檔只能讀不能寫)
   

Java代碼

  1. public String getFromAsset(String fileName){  
  2.     String res="";  
  3.     try{  
  4.      InputStream in = getResources().getAssets().open(fileName);    
  5.      int length = in.available();          
  6.         byte [] buffer = new byte[length];         
  7.         in.read(buffer);             
  8.         res = EncodingUtils.getString(buffer, "UTF-8");      
  9.     }  
  10.     catch(Exception e){  
  11.      e.printStackTrace();          
  12.     }  
  13.     return res;  
  14.    }  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.