Android 資源文件基本使用

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

語言代碼表查詢:

源碼下載:

ResourceFileOperation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【庫】res/raw與assets區(qū)別:http://blog.csdn.net/chdjj/article/de...
    酷泡泡閱讀 933評(píng)論 0 0
  • 1.概況 Android APK是如何來的呢?懷著這個(gè)問題去查資料,發(fā)現(xiàn)了下邊這張圖。 由android的項(xiàng)目經(jīng)過...
    KaelQ閱讀 20,065評(píng)論 4 55
  • Resources 概覽 Overview 提供資源 Providing Resources 感悟 外部化應(yīng)用資源...
    獅_子歌歌閱讀 2,853評(píng)論 0 0
  • 參考Android資源管理框架(Asset Manager)簡要介紹和學(xué)習(xí)計(jì)劃Android Resource介紹...
    合肥黑閱讀 3,046評(píng)論 0 2
  • 要是沒有服飾化妝品的裝扮,我覺得還是女人比男人好看!女人沒有胡子,各處的毛發(fā)也比男人稀薄,沒有喉結(jié),沒有發(fā)達(dá)的肌肉...
    給我一個(gè)留下的理由閱讀 296評(píng)論 0 1

友情鏈接更多精彩內(nèi)容