天天看點

Android中assets目錄和raw目錄的差別和使用情況

本文轉自百度知道,原文:百度知道問題

共同點:

它們會被原封不動的拷貝到APK中,而不會像其它資源檔案那樣被編譯成二進制的形式。

差別:

1 . 當然最直覺的就是擷取它們的InputStream的API不一樣了。

assets:
InputStream assets = getAssets().open("xxxx");

raw:
InputStream raw=getResources().openRawResource(R.raw.xxxx)
           

有人可能會有疑問,既然它們都是被原封不動的拷貝到APK中,而assets可以建立目錄結構,又能夠動态的列出assets中的所有資源getAssets().list(String path);,這些raw都做不到,那raw還有什麼用呢?

2 .主要的差別:

raw下的資源檔案會生成id,可以通過id友善通路,

assets下的資源檔案不會生成id,通路通過io流。

3 .raw下不能再有檔案夾,assets下仍可以再放檔案夾。

由于raw是Resources (res)的子目錄,Android會自動的為這目錄中的所有資源檔案生成一個ID,這個ID會被存儲在R類當中,作為一個檔案的引用。這意味着這個資源 檔案可以很容易的被Android的類和方法通路到,甚至在Android XML檔案中你也可以@raw/的形式引用到它。

在Android中,使用ID是通路一個檔案最快捷的方式。MP3和Ogg檔案放在這個目錄下是比較合适的。

assets目錄更像一個附錄類型的目錄,Android不會為這個目錄中的檔案生成ID并儲存在R類當中,是以它與 Android中的一些類和方法相容度更低。

同時,由于你需要一個字元串路徑來擷取這個目錄下的檔案描述符,通路的速度會更慢。但是把一些檔案放在這個目 錄下會使一些操作更加友善,比方說拷貝一個資料庫檔案到系統記憶體中。

要注意的是,你無法在Android XML檔案中引用到assets目錄下的檔案,隻能通過AssetManager來通路這些檔案。資料庫檔案和遊戲資料等放在這個目錄下是比較合适的。

另 外,網上關于assets和raw的資料都千篇一律了,是以關于這兩者中單個檔案大小不能超過1M的錯誤描述也在傳播,即如果讀取超過1M的檔案 會報”Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)”的IOException,還引申出種種解決方案。

将近5M的壓縮 包在assets和raw中都能正常通路,理論上隻要打包不超過Android APK 50M大小的限制都是沒有問題的。當然了,不排除是Android很早期的時候因為裝置硬體原因aapt在編譯的時候對這兩個檔案夾大小做出了限制,如果 是這樣,較新版的ADT應該不會出現這種情況。

參考這篇文章http://ponystyle.com/blog/2010/03 /26/dealing-with-asset-compression-in-android-apps/ ,文章比較簡單清晰。這篇文章應該還蠻有說服力的,從根本上說明了當時Android2.3以前産生資源檔案單個檔案大小不能超過1M的原 因和部分解決方法。