参考链接
第一种:
res/raw目录下存放的可编译的资源文件。
编译时,系统会自动在R.java中生成资源文件的ID,所以访问这种资源比较简单,通过在程序中调用R.id.filename即可。
第二种:
assets目录下存放的原始资源文件,因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.id.filename的方式访问它们。那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk目录下,assets被绑定在apk里,以apk形式存在,并不会解压到/data/data/YourApp目录下去,所以我们无法直接获取到assets的绝对路径,因为它们根本就没有独立存在。
res/raw和assets的相同点:
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构(在其目录下可以再建文件夹)
3.读取res/raw下的文件资源,通过以下方式获取输入流:
Context.getResources().openRawResource(R.raw.sample);
读取assets下的文件资源,通过以下方式获取输入流:
AssetManager mAssetManger = getAssets();
InputStream file=null;
String[] assList = mAssetManger.list("");
for (String item: assList) {
file = mAssetManger.open(item);
break;
}