1. 程式人生 > >Asset目錄與res目錄

Asset目錄與res目錄

android中的資原始檔,主要分為兩類:

一種出於assets目錄下,稱為原生檔案,無法通過R資源清單類訪問,這類檔案在被打包成apk檔案時是不會進行壓縮的;

一類則是res下的檔案,這類檔案在打包成apk檔案時,可通過R資源清單類訪問,會進行小記憶體優化的哦。

 兩種不同型別的檔案,對應著不同的訪問模式。我們先來看看asset檔案的訪問:

     android中有一個專門的類來處理應用對asset檔案的訪問,這個類就是AssetManager。其內有一個open()方法可以根據使用者提供的檔名,返回一個InputStream物件供使用者使用。

我們截圖看下api中的方法:

這裡我們可以看到open方法以及其他的相應方法,對於其中有一個引數accessMode,則指定了系統獲取資源的模式。主要值有以下幾種:

ACCESS_BUFFER :載入檔案到記憶體中,這種方式適合小檔案的讀取;

ACCESS_RANDOM:可以隨意的向前或者向後的讀取資料塊

ACCESS_STRAMING:順序的讀取內容

ACCESS_UNKNOWN:當沒有明確指定時,使用預設模式

這裡我們一定要注意,open(String fileName)預設的使用ACCESS_STREAMING模式進行讀取!!

那麼我們如何獲得一個AssetManager物件呢,在activity中我們可以通過以下的程式碼獲取:

AssetManager assetManager = this.getResources().getAsset();

-----------------------------------------------------------------------------------

如何訪問res目錄下的檔案呢?

我們再activity中可以通過如下方法進行訪問,InputStream inputStream = Resources.openRawResource(int id);

api中是這樣描述的:


大家都知道建立一個Android專案後會產生assets與res的兩個資料夾,理論上他們都是存放資源的資料夾,那麼他們到底有什麼區別呢?

1.assets:不會在R.java檔案下生成相應的標記,存放到這裡的資源在執行打包的時候都會打入程式安裝包中

2.res:會在R.java檔案下生成標記,這裡的資源會在執行打包操作的時候判斷哪些被使用到了,沒有被使用到的檔案資源是不會打包到安裝包中的。

在res資料夾下其實還可以定義一下目錄:

res/anim:這裡存放的是動畫資源。

res/xml:可以在Activity中使用getResource().getXML()讀取這裡的資原始檔

res/raw:該目錄下的檔案可以直接複製到裝置上,編譯軟體時,這裡的資料不需要編譯,直接加入到程式安裝包中,使用方法是getResource().OpenRawResources(ID),其中引數ID的形式是R.raw.XXX.


*res/raw和assets的相同點:
1.兩者目錄下的檔案在打包後會原封不動的儲存在apk包中,不會被編譯成二進位制。

*res/raw和assets的不同點:
1.res/raw中的檔案會被對映到R.java檔案中,訪問的時候直接使用資源ID即R.id.filename;assets資料夾下的檔案不會被對映到R.java中,訪問的時候需要AssetManager類。
2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立資料夾

*讀取檔案資源:
1.讀取res/raw下的檔案資源,通過以下方式獲取輸入流來進行寫操作
· InputStream is =getResources().openRawResource(R.id.filename);
2.讀取assets下的檔案資源,通過以下方式獲取輸入流來進行寫操作
· AssetManager am = null;
· am = getAssets();
· InputStream is = am.open("filename");

注意1:Google的Android系統處理Assert有個bug,在AssertManager中不能處理單個超過1MB的檔案,不然會報異常,raw沒這個限制可以放個4MB的Mp3檔案沒問題。

注意2:assets 資料夾是存放不進行編譯加工的原生檔案,即該資料夾裡面的檔案不會像 xml, java 檔案被預編譯,可以存放一些圖片,html,js, css 等檔案。