項(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