assets和raw目錄中資源的區(qū)別
相同點
- 在打包生成的apk中兩者目錄下的文件都保持原始的文件格式,不會被編譯成二進制。
不同點
- res/raw中的文件會被映射到R.Java文件中好港,訪問時直接使用資源ID即R.raw.filename吏够,而assets目錄下的文件不會被映射到R.java中抡草,訪問時需借助AssetManager類觅赊。
- res/raw目錄下不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu)捉邢,即assets目錄下可以再創(chuàng)建子目錄脯丝。
注意:
- assets目錄是存放不進行編譯加工的原生文件,即該文件夾里面的文件不會像xml和java文件被預(yù)編譯伏伐,可以存放一些image宠进、html、js藐翎、css等文件材蹬。
-
Google的Android系統(tǒng)處理Assert有個bug,在AssertManager中不能處理單個超過1MB的文件吝镣,不然會報異常堤器,raw沒這個限制可以放個4MB的Mp3文件沒問題。(了解更多)
assets和raw目錄中資源的訪問
讀取res/raw目錄下的資源文件linewalker.mp3末贾,通過以下方式獲取輸入流來進行寫操作:
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 "奇異果")
使用以每次讀取一行的方式來讀取整個文件:
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/vocabulary.md中的內(nèi)容如下:
7. 兩個婦女在聊天吼旧,聊起自己大讀大學(xué)的孩子。A:我每個月給女兒寄八百元未舟,可女兒總是錢說不夠用。不知道她都干了些什么掂为,可真夠讓人擔(dān)心的裕膀。B:我女兒從來都不給家里要錢,才讓人擔(dān)心呢勇哗。
使用以每次讀取一個字節(jié)的方式來讀取整個文件:
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/中有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;
}
});
}
顯示效果:
讀取assets目錄下的文件資源health.txt,通過以下方式獲取輸入流來進行寫操作:
InputStream is = getResources().getAssets().open("health.txt");
or
AssetManager am = getAssets();
InputStream is = am.open("health.txt");
- assets/health.txt的部分內(nèi)容如下:
1 欲诺、巧用牙膏:若有小面積皮膚損傷或燒傷抄谐、燙傷,抹上少許牙膏扰法,可立即止血止痛蛹含,也可防止感染,療效頗佳塞颁。
2 、巧除紗窗油膩:可將洗衣粉虹曙、吸煙剩下的煙頭一起放在水里涌萤,待溶解后,拿來擦玻璃窗咽安、紗窗,效果均不錯蓬推。
3 妆棒、將蝦仁放入碗內(nèi),加一點精鹽沸伏、食用堿粉糕珊,用手抓搓一會兒后用清水浸泡,然后再用清水洗凈馋评,這樣能使炒出的蝦仁透明如水晶放接,爽嫩可口。
4 留特、和餃子面的竅門1:在1斤面粉里摻入6個蛋清纠脾,使面里蛋白質(zhì)增加,包的餃子下鍋后蛋白質(zhì)會很快凝固收縮蜕青,餃子起鍋后收水快苟蹈,不易粘連
5 、將殘茶葉浸入水中數(shù)天后右核,澆在植物根部慧脱,可促進植物生長;把殘茶葉曬干贺喝,放到廁所或溝渠里燃熏菱鸥,可消除惡臭,具有驅(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é)果:
HTML字符實體的引用
- 首先在values/strings.xml中保存對應(yīng)的HTML字符實體的實體編號
<string name="text_item">項目</string>
<string name="text_number">數(shù)值</string>
<string name="text_unit">單位</string>
<string name="text_temp">溫度</string>
<string name="text_price">價格</string>
<!--HTML Character Entities-->
<string name="html_char_yen">¥</string>
<string name="html_char_deg">°</string>
- 然后在activity中進行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字符轉(zhuǎn)義查詢:
注意:
- 引用定義在res/values/strings.xml的單引號字符資源或者其HTML字符實體編號資源時氮采,需要進行轉(zhuǎn)義,否則會報錯
<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即可:
兩個文件的內(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">對成功抱有信心茶行,就近乎成功躯概。</string>
</resources>
- 最后切換手機的系統(tǒng)語言設(shè)置即可查看國際化效果