*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");
assets文件夾里面的文件都是保持原始的文件格式,需要用AssetManager以字節流的形式讀取文件。
1. 先在Activity里面調用getAssets()來獲取AssetManager引用。
2. 再用AssetManager的open(String fileName, int accessMode)方法則指定讀取的文件以及訪問模式就能得到輸入流InputStream。
3. 然后就是用已經open file 的inputStream讀取文件,讀取完成后記得inputStream.close()。
4.調用AssetManager.close()關閉AssetManager。
附帶
res文件夾里面的多個文件夾的各自介紹(來自網上的Android開發指南中文版內容):
目錄Directory |
資源類型Resource Types |
res/anim/ |
XML文件,它們被編譯進逐幀動畫(frame by frame animation)或補間動畫(tweened animation)對象 |
res/drawable/ |
.png、.9.png、.jpg文件,它們被編譯進以下的Drawable資源子類型中: 要獲得這種類型的一個資源,可以使用Resource.getDrawable(id) 為了獲取資源類型,使用mContext.getResources().getDrawable(R.drawable.imageId) 注意:放在這里的圖像資源可能會被aapt工具自動地進行無損壓縮優化。比如,一個真彩色但並不需要256色的PNG可能會被轉換為一個帶調色板的8位PNG。這使得同等質量的圖片占用更少的資源。所以我們得意識到這些放在該目錄下的二進制圖像在生成時可能會發生變化。如果你想讀取一個圖像位流並轉換成一個位圖(bitmap),請把圖像文件放在res/raw/目錄下,這樣可以避免被自動優化。 |
res/layout/ |
被編譯為屏幕布局(或屏幕的一部分)的XML文件。參見布局聲明(Declaring Layout) |
res/values/ |
可以被編譯成很多種類型的資源的XML文件。 注意: 不像其他的res/文件夾,它可以保存任意數量的文件,這些文件保存了要創建資源的描述,而不是資源本身。XML元素類型控制這些資源應該放在R類的什么地方。 盡管這個文件夾里的文件可以任意命名,不過下面使一些比較典型的文件(文件命名的慣例是將元素類型包含在該名稱之中): array.xml 定義數組 colors.xml 定義color drawable和顏色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分別獲得這些資源。 dimens.xml定義尺寸值(dimension value)。使用Resources.getDimension()獲得這些資源。 strings.xml定義字符串(string)值。使用Resources.getString()或者Resources.getText()獲取這些資源。getText()會保留在UI字符串上應用的豐富的文本樣式。 styles.xml 定義樣式(style)對象。 |
res/xml/ |
任意的XML文件,在運行時可以通過調用Resources.getXML()讀取。 |
res/raw/ |
直接復制到設備中的任意文件。它們無需編譯,添加到你的應用程序編譯產生的壓縮文件中。要使用這些資源,可以調用Resources.openRawResource(),參數是資源的ID,即R.raw.somefilename。 |