Android開發之資源檔儲存

來源:互聯網
上載者:User

在Android開發中關於資源檔的儲存操作。  在android開發中,資源檔是我們使用頻率最高的,無論是string,drawable,還是layout,這些資源都是我們經常使用到的,而且為我們的開始提供很多方便,不過我們平時接觸的資來源目錄一般都是下面這三個。 /res/drawable /res/values /res/layout  除些之外,Android資源檔還有以下三種會經常使用到: /res/xml   /res/raw /assets   首先是/res/xml ,這個目錄中大家可能偶爾用到過,這裡可以用來儲存xml格式的檔案,並且和其他資源檔一樣,這裡的資源是會被編譯成二進位格式放到最終的安裝包裡的,我們也可以通過R類來訪問這裡的檔案,並且解析裡面的內容。    例如我們在這裡存放了一個名為file.xml的檔案:  <?xml version="1.0" encoding="utf-8"?> <book><title>XML進階編程</< span>title></< span>book>      隨後,我們就可以通過資源ID來訪問並解析這個檔案了,如下代碼所示:       XmlResourceParser xml = getResources().getXml(R.xml.file);     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方式差不多。 要注意的是,這裡的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/包名)        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檔案夾中擷取檔案並讀取資料(資源檔只能讀不能寫)       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中擷取檔案並讀取資料(資源檔只能讀不能寫)     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;  }  關於Android擷取assets的絕對路徑有如下方法: 第一種方法:   String path = "file:///android_asset/檔案名稱"; 第二種方法: InputStream abpath = getClass().getResourceAsStream("/assets/檔案名稱");   若要想要轉換成String類型,則使用下列代碼:        String path = new String(InputStreamToByte(abpath ));     private byte[] InputStreamToByte(InputStream is) throws IOException {        ByteArrayOutputStream bytestream = new ByteArrayOutputStream();        int ch;         while ((ch = is.read()) != -1) {            bytestream.write(ch);        }         byte imgdata[] = bytestream.toByteArray();        bytestream.close();        return imgdata;    }    

聯繫我們

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