Android 中资源文件夹RES/RAW和ASSETS的使用区别

文章目录

在Android开发中,res/raw和assets文件夹分别用于存储不同类型的资源文件。它们的使用方法和适用场景各有不同。以下是对这两个文件夹的详细解析,包括它们的用途、访问方式、使用场景、优缺点以及一些高级用法。

1、res/raw 文件夹

res/raw 文件夹用于存放原始的、未经处理的资源文件,例如音频文件、视频文件和纯文本文件。这些文件在编译时不会被处理成其他格式,而是以原样保留。

1.1、特点

*文件名要求 :文件名必须由小写字母、数字和下划线组成。

*资源ID :在R类中生成资源ID,通过资源ID访问文件。

*编译处理:资源文件会在编译时打包到APK中,可以通过资源ID直接访问。

1.2、使用方法

1、放置文件:

将资源文件放入res/raw文件夹中。例如,将音频文件sample.mp3放入res/raw。

2、访问资源:

通过Resources类的openRawResource方法访问资源。

java 复制代码
InputStream inputStream = getResources().openRawResource(R.raw.sample);

1.3、示例:

1、读取文本文件

假设在res/raw文件夹中有一个文本文件example.txt,读取文件内容的代码如下:

java 复制代码
try {
    InputStream inputStream = getResources().openRawResource(R.raw.example);
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        stringBuilder.append(line);
    }
    reader.close();
    String fileContent = stringBuilder.toString();
} catch (IOException e) {
    e.printStackTrace();
}

2、播放音频文件

假设在res/raw中有一个音频文件sound.mp3,可以通过以下代码播放它:

java 复制代码
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.sound);
mediaPlayer.start();

2. assets 文件夹

assets 文件夹用于存放应用程序的原始文件,可以包含复杂的文件夹结构,非常适合存放需要分层组织的资源,如HTML文件、字体、配置文件等。

2.1、特点

*支持文件夹层次结构 :可以包含子文件夹和多层次结构。

*文件名要求 :没有严格的命名要求,文件名可以包含大写字母和特殊字符。

*动态访问:通过AssetManager类动态访问文件。

2.2、使用方法

1、放置文件:

将资源文件放入assets文件夹中。例如,将配置文件settings.json放入assets/config文件夹中。

2、访问资源:

通过AssetManager类的open方法访问资源。

java 复制代码
AssetManager assetManager = getAssets();
InputStream inputStream = assetManager.open("config/settings.json");

2.3、示例:

1、读取JSON配置文件

假设在assets文件夹中有一个配置文件config/settings.json,读取文件内容并解析JSON的代码如下:

java 复制代码
try {
    AssetManager assetManager = getAssets();
    InputStream inputStream = assetManager.open("config/settings.json");
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        stringBuilder.append(line);
    }
    reader.close();
    String jsonString = stringBuilder.toString();
    JSONObject jsonObject = new JSONObject(jsonString);
    // 解析jsonObject,获取配置信息
} catch (IOException | JSONException e) {
    e.printStackTrace();
}

2、从 assets 加载 HTML 文件

假设有一个 HTML 文件 webpage.html 存放在 assets 文件夹中,可以使用 WebView 加载它:

java 复制代码
WebView webView = findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/webpage.html");

3、使用场景

3.1、res/raw 使用场景

*音频文件 :存放音频文件,如res/raw/sound.mp3。
*视频文件 :存放视频文件,如res/raw/video.mp4。
*纯文本文件:存放纯文本文件,如res/raw/readme.txt。

3.2、assets 使用场景

*复杂文件结构 :需要分层组织的资源,如assets/html/index.html。
*配置文件 :存放JSON、XML等配置文件,如assets/config/settings.json。
*字体文件 :存放自定义字体文件,如assets/fonts/custom_font.ttf。

4、比较与选择

5、文件夹选择的建议

*文件组织需求:如果需要分层次组织资源文件,选择assets;否则选择res/raw。

*访问方式:如果希望通过资源ID快速访问,选择res/raw;如果需要通过文件路径灵活访问,选择assets。

*文件大小和类型:对于大型文件和特定类型的文件(如HTML、JSON等),通常放在assets更为合适。

6、 示例代码总结

6.1、res/raw 示例

java 复制代码
// 读取res/raw/example.txt文件内容
try {
    InputStream inputStream = getResources().openRawResource(R.raw.example);
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        stringBuilder.append(line);
    }
    reader.close();
    String fileContent = stringBuilder.toString();
} catch (IOException e) {
    e.printStackTrace();
}

6.2、assets 示例

java 复制代码
// 读取assets/config/settings.json文件内容并解析JSON
try {
    AssetManager assetManager = getAssets();
    InputStream inputStream = assetManager.open("config/settings.json");
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        stringBuilder.append(line);
    }
    reader.close();
    String jsonString = stringBuilder.toString();
    JSONObject jsonObject = new JSONObject(jsonString);
    // 解析jsonObject,获取配置信息
} catch (IOException | JSONException e) {
    e.printStackTrace();
}

7、高级用法和注意事项

7.1、res/raw 文件夹的限制

文件名要求严格 :必须由小写字母、数字和下划线组成,不能包含大写字母和特殊字符。
路径访问受限:不能通过文件路径访问,必须通过资源ID访问。

7.2、assets 文件夹的高级用法

文件夹结构 :支持子文件夹和多层次结构,非常适合存放需要分类的资源,如HTML文件、字体、配置文件等。
灵活性:可以动态读取和解析文件内容,适合在运行时需要根据具体情况处理资源的场景。

8、总结

在Android开发中,选择使用res/raw还是assets文件夹取决于具体需求:
*res/raw:适用于简单的资源文件,文件名有严格要求,通过资源ID访问。
1、优点:直接通过资源ID访问,性能较好。
2、缺点:不支持复杂的文件夹结构,文件名有严格要求。
3、适用场景:简单资源文件,如音频、视频、文本等

*assets:适用于复杂的资源文件,支持文件夹层次结构,通过文件路径动态访问。
通过合理选择和使用这两个文件夹,可以实现更高效的资源管理和访问,提升应用的组织性和性能。
1、优点:支持复杂的文件夹结构,通过文件路径灵活访问。
2、缺点:需要通过 AssetManager 访问,略微复杂。
3、适用场景:复杂资源文件,大型数据文件,需要动态加载的文件。

理解 res/raw 和 assets 文件夹的区别和使用方法,有助于更好地管理应用资源,提高开发效率和应用性能。通过合理选择和使用这两种文件夹,可以实现更灵活的资源管理方案。

|----------------------------------|
| 欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |

相关推荐
长亭外的少年6 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿9 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神10 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛10 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法11 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter12 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快13 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl13 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江14 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
Dnelic-14 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记