assets目錄和res/raw目錄的區(qū)別

項(xiàng)目中,歡迎頁(yè)背景為視頻,就視頻文件到底放在哪個(gè)地方這一問(wèn)題,跟同事觀點(diǎn)有些不合,查閱相關(guān)資料,在此記錄。
網(wǎng)上關(guān)于assets和raw的資料確實(shí)都千篇一律了,看我這篇摘錄或者下面這兩篇差不多了
http://www.cnblogs.com/yuzhongzheng/p/5412576.html
http://blog.csdn.net/blogblj/article/details/21228963

相同點(diǎn):
assets和res/raw工程目錄下都可以放一些小于1M的文件(2.3版本以前要求,現(xiàn)在無(wú)此限制,具體查看這篇文章http://blog.csdn.net/blogblj/article/details/21228963)兩個(gè)文件夾下的文件都會(huì)被原封不動(dòng)的打包到APK中應(yīng)用使用。而不會(huì)像其它資源文件那樣被編譯成二進(jìn)制的形式。(不管放在哪個(gè)文件夾下apk的大小是不變的)

不同點(diǎn):
1.res/raw中的文件會(huì)被映射到R.java文件中,訪問(wèn)的時(shí)候直接使用資源ID即R.id.filename;assets文件夾下的文件不會(huì)被映射到R.java中,訪問(wèn)的時(shí)候需要AssetManager類。
2.res/raw不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu),也就是assets目錄下可以再建立文件夾

問(wèn)Android中assets目錄和raw目錄的區(qū)別和使用情況
能提出這個(gè)問(wèn)題的,應(yīng)該都了解它們的共同點(diǎn):
它們會(huì)被原封不動(dòng)的拷貝到APK中,而不會(huì)像其它資源文件那樣被編譯成二進(jìn)制的形式。
要說(shuō)區(qū)別,當(dāng)然最直觀的就是獲取它們的InputStream的API不一樣了。
assets:InputStream assets = getAssets().open("xxxx");
raw:InputStream raw = getResources().openRawResource(R.raw.xxxx)
有人可能會(huì)有疑問(wèn),既然它們都是被原封不動(dòng)的拷貝到APK中,而assets可以創(chuàng)建目錄結(jié)構(gòu),又能夠動(dòng)態(tài)的列出assets中的所有資源getAssets().list(String path);,這些raw都做不到,那raw還有什么用呢?

有人可能會(huì)有疑問(wèn),既然它們都是被原封不動(dòng)的拷貝到APK中,而assets可以創(chuàng)建目錄結(jié)構(gòu),又能夠動(dòng)態(tài)的列出assets中的所有資源getAssets().list(String path);,這些raw都做不到,那raw還有什么用呢?
下面我們來(lái)說(shuō)說(shuō)它們主要的區(qū)別:
由于raw是Resources (res)的子目錄,Android會(huì)自動(dòng)的為這目錄中的所有資源文件生成一個(gè)ID,這個(gè)ID會(huì)被存儲(chǔ)在R類當(dāng)中,作為一個(gè)文件的引用。這意味著這個(gè)資源文件可以很容易的被Android的類和方法訪問(wèn)到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是訪問(wèn)一個(gè)文件最快捷的方式。MP3和Ogg文件放在這個(gè)目錄下是比較合適的。

assets目錄更像一個(gè)附錄類型的目錄,Android不會(huì)為這個(gè)目錄中的文件生成ID并保存在R類當(dāng)中,因此它與Android中的一些類和方法兼容度更低。同時(shí),由于你需要一個(gè)字符串路徑來(lái)獲取這個(gè)目錄下的文件描述符,訪問(wèn)的速度會(huì)更慢。但是把一些文件放在這個(gè)目錄下會(huì)使一些操作更加方便,比方說(shuō)拷貝一個(gè)數(shù)據(jù)庫(kù)文件到系統(tǒng)內(nèi)存中。要注意的是,你無(wú)法在Android XML文件中引用到assets目錄下的文件,只能通過(guò)AssetManager來(lái)訪問(wèn)這些文件。數(shù)據(jù)庫(kù)文件和游戲數(shù)據(jù)等放在這個(gè)目錄下是比較合適的。

The main differences between the raw folder and the Assets folder.
https://stackoverflow.com/questions/9563373/the-reason-for-assets-and-raw-resources-in-android

Since raw is a subfolder of Resources (res), Android will automatically generate an ID for any file located inside it. This ID is then stored an the R class that will act as a reference to a file, meaning it can be easily accessed from other Android classes and methods and even in Android XML files. Using the automatically generated ID is the fastest way to have access to a file in Android.

The Assets folder is an “appendix” directory. The R class does not generate IDs for the files placed there, so its less compatible with some Android classes and methods. Also, it’s much slower to access a file inside it, since you will need to get a handle to it based on a String. However some operations are more easily done by placing files in this folder, like copying a database file to the system’s memory. There’s no (easy) way to create an Android XML reference to files inside the Assets folder.

1.網(wǎng)上有些文章說(shuō)可以這樣獲取assets的絕對(duì)路徑
String path = "file:///android_asset/文件名";
測(cè)試是不可以的

2.讀取文件資源:
1.讀取res/raw下的文件資源,通過(guò)以下方式獲取輸入流來(lái)進(jìn)行寫(xiě)操作
InputStream is = getResources().openRawResource(R.id.filename);
2.讀取assets下的文件資源,通過(guò)以下方式獲取輸入流來(lái)進(jìn)行寫(xiě)操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");

3.assets目錄的位置問(wèn)題,在Eclispe中,這個(gè)目錄的位置在res/下面,但到了Android Studio中,這個(gè)assets目錄必須放在跟java和res同級(jí)目錄下

4.Android中讀取assets目錄下的文件詳細(xì)介紹
http://blog.csdn.net/greathfs/article/details/52123984

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,881評(píng)論 25 709
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,317評(píng)論 0 17
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • *res/raw和assets的相同點(diǎn):1.兩者目錄下的文件在打包后會(huì)原封不動(dòng)的保存在apk包中,不會(huì)被編譯成二進(jìn)...
    忘塵And閱讀 2,397評(píng)論 1 2
  • 杰西·利弗莫爾(J.Livermore),1980-1990年代華爾街最具傳奇色彩的超級(jí)操盤(pán)手?!豆善弊魇只貞涗洝?..
    寒蟬讀書(shū)筆記閱讀 812評(píng)論 2 4

友情鏈接更多精彩內(nèi)容