Android 資源文件基本使用

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_read_line.jpg
  • 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_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,通過以下方式獲取輸入流來進行寫操作:

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é)果:

res_assets.jpg

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_char_entity_string.jpg

常用的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即可:

i18n_zh_rCN_strings.png

兩個文件的內(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è)置即可查看國際化效果
i18n_show_en.jpg
i18n_show_cn.jpg

語言代碼表查詢:

源碼下載:

ResourceFileOperation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畔师,隨后出現(xiàn)的幾起案子娶靡,更是在濱河造成了極大的恐慌,老刑警劉巖看锉,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件固蛾,死亡現(xiàn)場離奇詭異结执,居然都是意外死亡,警方通過查閱死者的電腦和手機艾凯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門献幔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趾诗,你說我怎么就攤上這事蜡感。” “怎么了恃泪?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵郑兴,是天一觀的道長。 經(jīng)常有香客問我贝乎,道長情连,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任览效,我火速辦了婚禮却舀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锤灿。我一直安慰自己挽拔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布但校。 她就那樣靜靜地躺著螃诅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪状囱。 梳的紋絲不亂的頭發(fā)上术裸,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音亭枷,去河邊找鬼穗椅。 笑死,一個胖子當(dāng)著我的面吹牛奶栖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播门坷,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼宣鄙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了默蚌?” 一聲冷哼從身側(cè)響起冻晤,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绸吸,沒想到半個月后鼻弧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體设江,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年攘轩,在試婚紗的時候發(fā)現(xiàn)自己被綠了叉存。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡度帮,死狀恐怖歼捏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笨篷,我是刑警寧澤瞳秽,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站率翅,受9級特大地震影響练俐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冕臭,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一腺晾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浴韭,春花似錦丘喻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榴芳,卻和暖如春嗡靡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窟感。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工讨彼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柿祈。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓哈误,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躏嚎。 傳聞我的和親對象是個殘疾皇子蜜自,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容