在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; }