assets和raw目錄中資源的區(qū)別
相同點(diǎn)
- 在打包生成的apk中兩者目錄下的文件都保持原始的文件格式,不會(huì)被編譯成二進(jìn)制。
不同點(diǎn)
- res/raw中的文件會(huì)被映射到R.Java文件中,訪問時(shí)直接使用資源ID即R.raw.filename,而assets目錄下的文件不會(huì)被映射到R.java中,訪問時(shí)需借助AssetManager類。
- res/raw目錄下不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu),即assets目錄下可以再創(chuàng)建子目錄。
注意:
- assets目錄是存放不進(jìn)行編譯加工的原生文件,即該文件夾里面的文件不會(huì)像xml和java文件被預(yù)編譯,可以存放一些image、html、js、css等文件。
-
Google的Android系統(tǒng)處理Assert有個(gè)bug,在AssertManager中不能處理單個(gè)超過1MB的文件,不然會(huì)報(bào)異常,raw沒這個(gè)限制可以放個(gè)4MB的Mp3文件沒問題。(了解更多)
assets和raw目錄中資源的訪問
讀取res/raw目錄下的資源文件linewalker.mp3,通過以下方式獲取輸入流來進(jìn)行寫操作:
InputStream is = getResources().openRawResource(R.raw.linewalker.mp3);
- res/raw/vocabulary.md中的內(nèi)容如下:
* ###### [*A*pple](#a "蘋果")
* ###### [*B*lackberry](#b "黑莓")
* ###### [*C*oconut](#c "椰子")
* ###### [*D*urian](#d "榴蓮")
* ###### [*E*lder berry](#e "接骨木果")
* ###### [*F*ig](#f "無花果")
* ###### [*G*rape](#g "葡萄")
* ###### [*H*oney-dew melon](#h "哈密瓜")
* ###### [*I*yokan](#i "伊予柑")
* ###### [*J*uicy peach](#j "水蜜桃")
* ###### [*K*iwi](#k "奇異果")
使用以每次讀取一行的方式來讀取整個(gè)文件:
public String getResourceFromRawByReadLine(int resId) {
InputStreamReader inputReader = null;
BufferedReader bufReader = null;
String result = "";
try {
inputReader = new InputStreamReader(getResources().openRawResource(resId));
bufReader = new BufferedReader(inputReader);
String line;
while ((line = bufReader.readLine()) != null) {
result += line + "\n";
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputReader != null) {
inputReader.close();
}
if (bufReader != null) {
bufReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
顯示結(jié)果:

res_raw_read_line.jpg
- res/raw/vocabulary.md中的內(nèi)容如下:
7. 兩個(gè)婦女在聊天,聊起自己大讀大學(xué)的孩子。A:我每個(gè)月給女兒寄八百元,可女兒總是錢說不夠用。不知道她都干了些什么,可真夠讓人擔(dān)心的。B:我女兒從來都不給家里要錢,才讓人擔(dān)心呢。
使用以每次讀取一個(gè)字節(jié)的方式來讀取整個(gè)文件:
public String getResourceFromRawByReadByte(int resId) {
String result = "";
InputStream in = null;
ByteArrayOutputStream bos = null;
try {
in = getResources().openRawResource(resId);
bos = new ByteArrayOutputStream();
byte[] buffer = new byte[10 * 1024]; // 10kB
int len;
while ((len = in.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
result = bos.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
顯示結(jié)果:

res_raw_read_byte.jpg
- res/raw/中有traveling_light.mp3資源文件,使用R.raw.traveling_light的方式來讀取文件:
使用資源文件id來初始化MediaPlayer:
public void initMediaPlayer(int resId) {
mMediaPlayer = MediaPlayer.create(this, resId);
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
isCompletion = true;
}
});
}
顯示效果:

res_raw_resid_start.jpg

res_raw_resid_pause.jpg
讀取assets目錄下的文件資源health.txt,通過以下方式獲取輸入流來進(jìn)行寫操作:
InputStream is = getResources().getAssets().open("health.txt");
or
AssetManager am = getAssets();
InputStream is = am.open("health.txt");
- assets/health.txt的部分內(nèi)容如下:
1 、巧用牙膏:若有小面積皮膚損傷或燒傷、燙傷,抹上少許牙膏,可立即止血止痛,也可防止感染,療效頗佳。
2 、巧除紗窗油膩:可將洗衣粉、吸煙剩下的煙頭一起放在水里,待溶解后,拿來擦玻璃窗、紗窗,效果均不錯(cuò)。
3 、將蝦仁放入碗內(nèi),加一點(diǎn)精鹽、食用堿粉,用手抓搓一會(huì)兒后用清水浸泡,然后再用清水洗凈,這樣能使炒出的蝦仁透明如水晶,爽嫩可口。
4 、和餃子面的竅門1:在1斤面粉里摻入6個(gè)蛋清,使面里蛋白質(zhì)增加,包的餃子下鍋后蛋白質(zhì)會(huì)很快凝固收縮,餃子起鍋后收水快,不易粘連
5 、將殘茶葉浸入水中數(shù)天后,澆在植物根部,可促進(jìn)植物生長;把殘茶葉曬干,放到廁所或溝渠里燃熏,可消除惡臭,具有驅(qū)除蚊蠅的功能。
...
使用讀字節(jié)流的方式來讀取文件的全部內(nèi)容并顯示:
public String getResourceFromAssets(String fileName){
String result = "";
InputStream in = null;
try {
in = getResources().getAssets().open(fileName);
byte[] data = readRawFromStream(in);
if(data != null) {
result = new String(data);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public static byte[] readRawFromStream(InputStream fis) {
byte[] result = null;
ByteArrayOutputStream bos = null;
try {
bos = new ByteArrayOutputStream();
byte[] buffer = new byte[10 * 1024]; // 10kB
int len;
while ((len = fis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
result = bos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
調(diào)用getResourceFromAssets函數(shù)來讀取assets/health.txt:
mContentTextView = (TextView) findViewById(R.id.tv_content);
mContentTextView.setText(getResourceFromAssets("health.txt"));
顯示結(jié)果:

res_assets.jpg
HTML字符實(shí)體的引用
- 首先在values/strings.xml中保存對(duì)應(yīng)的HTML字符實(shí)體的實(shí)體編號(hào)
<string name="text_item">項(xiàng)目</string>
<string name="text_number">數(shù)值</string>
<string name="text_unit">單位</string>
<string name="text_temp">溫度</string>
<string name="text_price">價(jià)格</string>
<!--HTML Character Entities-->
<string name="html_char_yen">¥</string>
<string name="html_char_deg">°</string>
- 然后在activity中進(jìn)行string資源的引用
mTempTv.setText(R.string.text_temp);
float tempNumber = 26.8f;
String tempNumberString = String.format(Locale.getDefault(), "%.1f", tempNumber);
mTempNumberTv.setText(tempNumberString);
String char_deg = getResources().getString(R.string.html_char_deg) + "C";
mTempUnitTv.setText(char_deg);
mPriceTv.setText(R.string.text_price);
float priceNumber = 99.88f;
String priceNumberString = String.format(Locale.getDefault(), "%.2f", priceNumber);
mPriceNumberTv.setText(priceNumberString);
String char_yen = getResources().getString(R.string.html_char_yen);
mPriceUnitTv.setText(char_yen);
- 效果顯示

html_char_entity_string.jpg
常用的HTML字符轉(zhuǎn)義查詢:
注意:
- 引用定義在res/values/strings.xml的單引號(hào)字符資源或者其HTML字符實(shí)體編號(hào)資源時(shí),需要進(jìn)行轉(zhuǎn)義,否則會(huì)報(bào)錯(cuò)
<string name="html_char_apos">\'</string>
<string name="chat_welcome">I\'m pixie, and very glad to serve you.</string>
Android字符串國際化
將工程面板切換至工程顯示模式,選中res目錄右鍵選擇New/Android resource directory,創(chuàng)建指定語言為中文的目錄values-zh-rCN
然后選擇values/strings.xml右鍵復(fù)制copy,再選擇values-zh-rCN目錄右鍵粘貼paste即可:

i18n_zh_rCN_strings.png
兩個(gè)文件的內(nèi)容如下:
values/strings.xml
<resources>
<string name="app_name">I18N</string>
<string name="text_show">Show</string>
<string name="text_content">Confidence of success is almost success.</string>
</resources>
values-zh-rCN/strings.xml
<resources>
<string name="app_name">國際化</string>
<string name="text_show">顯示</string>
<string name="text_content">對(duì)成功抱有信心,就近乎成功。</string>
</resources>
- 最后切換手機(jī)的系統(tǒng)語言設(shè)置即可查看國際化效果

i18n_show_en.jpg

i18n_show_cn.jpg