一起来学Kotlin:概念:24. Assets 以及 Res/raw 文件夹下存放调用文件介绍及对比
有些时候,我们需要将一些文件(e.g. JSON, Text, mp3, pdf, txt, etc)存放在某些特定文件夹下,方便调用。这里有两种可能性:放在 assets
文件夹下,或者放在 res/raw
文件夹下。一个简单的结论是,两个文件夹下都可以放置,读取各种后缀的文件,但两者也有一些区别,罗列如下:
assets
文件夹下可以设置更灵活的文件名assets
文件夹下允许新建子文件夹assets
文件夹下允许在运行(run time)时列出文件名res/raw
支持自动加载不同配置的文件res/raw
从XML文件读取其文件夹中文件更容易
文章目录
- 一起来学Kotlin:概念:24. Assets 以及 Res/raw 文件夹下存放调用文件介绍及对比
- 1 如何创建 `assets` 以及 `res/raw` 文件夹
- 2 如何读取 `assets` 以及 `res/raw` 文件夹里的文件
- 3 区别1:`assets`文件夹下可以设置更灵活的文件名
- 4 区别2:`assets`文件夹下允许新建子文件夹
- 5 区别3:`assets`文件夹下允许在运行(run time)时列出文件名
- 6 区别4:`res/raw` 支持自动加载不同配置的文件
- 7 区别5:`res/raw` 从XML文件读取其文件夹中文件更容易
1 如何创建 assets
以及 res/raw
文件夹
如上图所示,我们可以对项目的 app
文件夹右键,New->Folder
,然后就能看到 Assets Folder
以及 Raw Resource Folder
了。
2 如何读取 assets
以及 res/raw
文件夹里的文件
比如,我们创建了上述两个文件夹后,在文件夹里均创建一个文件,命名为 config.properties
。两种调用方式比较类似,罗列如下:
val asset_read_string = applicationContext.assets.open("config.properties").bufferedReader().use{
it.readText()
}
val raw_read_string = applicationContext.resources.openRawResource(R.raw.config).bufferedReader().use{
it.readText()
}
3 区别1:assets
文件夹下可以设置更灵活的文件名
assets
文件夹下可以更宽松地命名文件,比如有一个空格(例如 some file name
),或者有大写字母(例如 someFileName
)。
res/raw
文件夹下的文件命名比较严格:File-based resource names must contain only lowercase a-z, 0-9, or underscore
。应该是因为调用的时候需要以 R.raw.XXX
的形式。
4 区别2:assets
文件夹下允许新建子文件夹
比如下图:
对于 res/raw
文件夹,这是不允许的。
5 区别3:assets
文件夹下允许在运行(run time)时列出文件名
如果我们想列出 assets
文件夹中的所有文件,我们可以使用 list
功能并提供文件夹名称(或 “” 代表根目录。注意,list函数输入的是一个string,所以如果我们想要列出比如 assets
文件夹下的 assets1
子文件夹内的文件,这里的输入需要加双引号:"assets1"
)。
assets.list("root_folder_name_in_assets")?.forEach {
println(it)
}
对于 res/raw
文件夹,这是不可能的,我们必须在开发期间(compile)知道文件名,而不是运行时(run time)。
6 区别4:res/raw
支持自动加载不同配置的文件
对于 assets
文件夹,如果我们想为不同的配置(设备的语言、Android API、屏幕方向)读取不同的文件,我们需要手动检测配置并读取相应的文件。
但是对于 res/raw
文件夹则不需要。下面是一个例子:
对于 API 29,可能我们会有一些配置文件,但设备 API高于29,我们也会有一些配置文件。这个时候,系统就会出现两个 raw 文件。和 res
下面的其他文件夹一样,我们不需要手动去选择或进行配置。
7 区别5:res/raw
从XML文件读取其文件夹中文件更容易
对于 assets
文件夹,我们好像没有简单的方法可以让 XML 文件(例如 AndroidManifest.xml)直接读取 assets
下的文件。但对于 res/raw
就很方便,我们直接使用 @raw/filename
就可以。