Android工程中assets与raw文件夹的区别
条评论 我们都知道Android工程中assets与raw文件夹都可以用来存放文件
比如已经设计好的数据库文件可以选择放到assets中(当然你们也可以放到raw里 ),这样程序在打包时会原封不动的保存到apk包中,不会被编译成二进制。早期android2.3以前的版本有着assets和raw里资源文件不能超过1M的限制,当然现在已经没有这个限制了。
res/raw和assets的相同点
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制
res/raw和assets的不同点
- res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
- res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
- 由于raw是Resources (res)的子目录,Android会自动的为这目录中的所有资源文件生成一个ID,这个ID会被存储在R类当中,作为一个文件的引用。这意味着这个资源文件可以很容易的被Android的类和方法访问到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是访问一个文件最快捷的方式。MP3和Ogg文件放在这个目录下是比较合适的。
- assets目录更像一个附录类型的目录,Android不会为这个目录中的文件生成ID并保存在R类当中,因此它与Android中的一些类和方法兼容度更低。同时,由于你需要一个字符串路径来获取这个目录下的文件描述符,访问的速度会更慢。但是把一些文件放在这个目录下会使一些操作更加方便,比方说拷贝一个数据库文件到系统内存中。要注意的是,你无法在Android XML文件中引用到assets目录下的文件,只能通过AssetManager来访问这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。
读取文件资源
- 读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
1
InputStream is = getResources().openRawResource(R.id.filename);
- 读取assets下的文件资源,通过以下方式获取输入流来进行写操作
1
2
3AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");
读取/res/raw下文件并写入sd卡的示例方法
1 | void makeFile() { |
另外,在Manifest中记得加入相关权限
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
读取/assets下文件并写入sd卡的示例方法
和上面的方法几乎一致,只是把:
1 | InputStream ins = getResources().openRawResource( |
改为:
1 | AssetManager assetManager = getAssets(); |
获取assets文件夹的所有文件
1 | AssetManager am = context.getAssets(); |
本文标题:Android工程中assets与raw文件夹的区别
文章作者:xmaihh
发布时间:2018-11-13
最后更新:2018-11-13
版权声明:采用[CC BY-NC-SA 4.0许可协议]进行许可
分享