在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的資源檔~
這三個目錄中我們平時開發應用的時候,還是很實用的,這裡發給大家,希望能對大家在開發應用時有所協助~
Android檔案資源(raw/data/asset)的存取
一、私人檔案夾下的檔案存取(/data/data/包名)
Java代碼
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import org.apache.http.util.EncodingUtils;
-
- public void writeFileData(String fileName,String message){
- try{
- FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);
- byte [] bytes = message.getBytes();
- fout.write(bytes);
- fout.close();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }
-
-
- public String readFileData(String fileName){
- String res="";
- try{
- FileInputStream fin = openFileInput(fileName);
- int length = fin.available();
- byte [] buffer = new byte[length];
- fin.read(buffer);
- res = EncodingUtils.getString(buffer, "UTF-8");
- fin.close();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- return res;
- }
二、從resource中的raw檔案夾中擷取檔案並讀取資料(資源檔只能讀不能寫)
Java代碼
- public String getFromRaw(String fileName){
- String res = "";
- try{
- InputStream in = getResources().openRawResource(R.raw.test1);
- int length = in.available();
- byte [] buffer = new byte[length];
- in.read(buffer);
- res = EncodingUtils.getString(buffer, "UTF-8");
- in.close();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- return res ;
- }
三、從asset中擷取檔案並讀取資料(資源檔只能讀不能寫)
Java代碼
- public String getFromAsset(String fileName){
- String res="";
- try{
- InputStream in = getResources().getAssets().open(fileName);
- int length = in.available();
- byte [] buffer = new byte[length];
- in.read(buffer);
- res = EncodingUtils.getString(buffer, "UTF-8");
- }
- catch(Exception e){
- e.printStackTrace();
- }
- return res;
- }