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

文章目录

    • 1、res/raw 文件夹
      • 1.1、特点
      • 1.2、使用方法
      • 1.3、示例:
    • 2. assets 文件夹
      • 2.1、特点
      • 2.2、使用方法
      • 2.3、示例:
    • 3、使用场景
      • 3.1、res/raw 使用场景
      • 3.2、assets 使用场景
    • 4、比较与选择
    • 5、文件夹选择的建议
    • 6、 示例代码总结
      • 6.1、res/raw 示例
      • 6.2、assets 示例
    • 7、高级用法和注意事项
      • 7.1、res/raw 文件夹的限制
      • 7.2、assets 文件夹的高级用法
    • 8、总结

在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方法访问资源。

InputStream inputStream = getResources().openRawResource(R.raw.sample);

1.3、示例:

1、读取文本文件
假设在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();
}

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

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方法访问资源。

AssetManager assetManager = getAssets();
InputStream inputStream = assetManager.open("config/settings.json");

2.3、示例:

1、读取JSON配置文件
假设在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();
}

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

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 示例

// 读取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 示例

// 读取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 文件夹的区别和使用方法,有助于更好地管理应用资源,提高开发效率和应用性能。通过合理选择和使用这两种文件夹,可以实现更灵活的资源管理方案。

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电瓶车进电梯识别报警摄像机

随着电动车的普及,越来越多的人选择电动车作为出行工具。在诸多场景中,电梯作为一种常见的交通工具,也受到了电动车用户的青睐。然而,电动车进入电梯时存在一些安全隐患,为了提高电动车进电梯的安全性,可以…

小程序自动化辅助渗透脚本(2024)

简介 1.还在一个个反编译小程序吗? 2.还在自己一个个注入hook吗? 3.还在一个个查看找接口、查找泄露吗? 现在有自动化辅助渗透脚本了,自动化辅助反编译、自动化注入hook、自动化查看泄露 注:本工具仅用于学习交流&…

Java中的JSON神器,如何轻松玩转复杂数据结构

哈喽,大家好,我是木头左! 一、揭秘JSON世界的基石 在Java的世界中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于文本,易于阅读和编写,同时也易于…

站内信设计

参考文章:https://cloud.tencent.com/developer/article/1684449 b站站内信业务设计: 消息的类型分为: 1、系统消息 2、、点赞、回复等用户行为之间的消息(事件提醒) 3、用户之间的消息 系统消息 用一个用户消息表可以吗? 可…

XS2185一款八通道以太网供电控制器

XS2185是一款八通道以太网供电控制器。 XS2185通过侦测各通道的DET管脚输入电压 来判断是否有合格的负载/PD接入系统,以决定 是否开启MOS供电开关。 当通道已经处于供电状态时,XS2185通过侦 测SENSE管脚的输入电压,以判断供电是否发生 …

免费,Python蓝桥杯等级考试真题--第15级(含答案解析和代码)

Python蓝桥杯等级考试真题–第15级 一、 选择题 答案:B 答案:D 解析:集合的并集运算有两种方式,一种是使用“|”运算符进行操作,另一种是使用union()方法来实现,故答案为D。 答案:A 解析&…

Caused by: java.lang.IllegalArgumentException: Unknown flag 0x1000

Dubbo使用Tomcat安装admin2.5.x管理平台时发生的错误: Caused by: java.lang.IllegalArgumentException: Unknown flag 0x1000 解决方法: 将本地的jdk环境变量切换成jdk8即可。

[ C++ ] 类和对象( 下 )

初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。 class Date { public: Date(int year, int month, int day): _year(year), _month(month), _d…

视频汇聚/云存储/安防监控EasyCVR接入GB28181设备未回复ack信息的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。 用户反馈,设备通过国标GB28181注…

kubeadm引导欧拉系统高可用的K8S1.28.X

文章目录 一. 核心组件架构二. 有状态与无状态应用三. 资源对象3.1 规约与状态3.2 资源的分类-元数据,集群,命名空间3.2.1 元数据3.2.2 集群资源 3.3 命名空间级3.3.1 pod3.3.2 pod-副本集3.3.3 pod-控制器 四. Kubeadm安装k8s集群4.1 初始操作4.2 ~~所有节点安装Docker&#x…

关于高性能滤波器和普通型滤波器的区别说明

高性能滤波器和普通型滤波器在性能和滤波效果上存在显著差异。以三安培为代表分析高性能滤波器和普通型滤波器的区别: 从上图曲线可看出: 1.高性能滤波器和普通型滤波器的滤波范围不同。普通型滤波器有效滤波范围为 150KHz~30MHz,而高性能滤…

【css3】02-css3新特性之选择器篇

目录 1 属性选择器 2 结构伪类选择器 3 其他选择器 :target和::selection ::first-line和::first-letter 4 伪类和伪元素的区别 伪类(Pseudo-classes) 伪元素(Pseudo-elements) 伪类和伪元素的区别 1 属性选择器 ☞ 属性选…

螺旋矩阵(算法题)

文章目录 螺旋矩阵解题思路 螺旋矩阵 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]解题思路 模…

人类和小鼠转录组上游分析

基础软件 conda install cutadapt, trimmomatic, samtools, hisat2, subread, deeptools -y人类转录组上游分析 # 样本名称 sample_namesample# 线程 threads4# 双端测序原始fastq1和fastq2路径 fastq1_path/path/${sample_name}_1.fq.gz fastq2_path/path/${sample_name}_2.…

5倍收益秘诀:APP广告如何变现?

在这个数字时代,智能手机几乎成了我们生活中不可或缺的一部分。无论是早晨醒来的第一件事,还是睡前的最后一件事,手机都与我们紧密相连。而在这个连接的世界里,APP广告变现成为了一个热门话题,它不仅仅是将每一次点击转…

Redis与数据库同步指南:订阅Binlog实现数据一致性

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是29岁的小米,一名积极活泼、热爱分享技术的开发者。今天,我们来聊聊分布式系统中的一个重要话题——分布式一致性,特别是数据库和R…

如何清除电脑使用痕迹?5个方法保护个人隐私!

“我在使用电脑时,想将之前的使用痕迹删除,不知道应该怎么才能正确操作呢,希望大家给我出出主意。” 在使用电脑的过程中,我们经常会留下各种使用痕迹,如浏览历史、文档记录、临时文件等。这些痕迹可能会暴露我们的隐私…

随机森林算法实现分类

随机森林算法实现对编码后二进制数据的识别 1.直接先上代码! import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import …

自用升级centos7.2的默认Python 2.7.5为python3.8

wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tgztar zxvf Python-3.8.8.tgz 进入刚刚解压后的目录 ./configure --prefix/data/soft/python3按照上面截图所属,需要安装gcc 安装报错需要安装 sudo yum install zlib1g-dev make -j4 make install -…

京东618全民拆快递 autojs一键脚本

京东618的最新活动为全民拆快递,因为是20周年的活动,所以可以瓜分20亿红包,想要购买一些家电的朋友可以提前关注起来,领取的红包可以直接抵扣,京东618全民拆快递软件app是专为此活动打造的一款辅助工具,可以帮你自动做任务,当然也支持淘宝的任务。 任务设置 1、自动打开…