Assets文件夹和RAW文件夹区别

转载自 http://www.cnblogs.com/pang123hui/archive/2013/11/06/3411523.html
– 感谢作者的分享

一、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则可以有目录结构,也就是assets目录下可以再建立文件夹

3.assets文件夹时工程默认创建的,但是res/raw需要手动创建

这里写图片描述

由于raw是Resources (res)的子目录,Android会自动的为这目录中的所有资源文件生成一个ID,这个ID会被存储在R类当中,作为一个文件的引用。这意味着这个资源文件可以很容易的被Android的类和方法访问到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是访问一个文件最快捷的方式。MP3和Ogg文件放在这个目录下是比较合适的。
assets目录更像一个附录类型的目录,Android不会为这个目录中的文件生成ID并保存在R类当中,因此它与Android中的一些类和方法兼容度更低。同时,由于你需要一个字符串路径来获取这个目录下的文件描述符,访问的速度会更慢。但是把一些文件放在这个目录下会使一些操作更加方便,比方说拷贝一个数据库文件到系统内存中。要注意的是,你无法在Android XML文件中引用到assets目录下的文件,只能通过AssetManager来访问这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。

三、读取文件资源

1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作

InputStream is =getResources().openRawResource(R.id.filename);  

2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作

扫描二维码关注公众号,回复: 3559455 查看本文章
AssetManager am = getAssets();  
InputStream is = am.open("filename");  

注意:

网上关于assets和raw的资料都千篇一律了,因此关于这两者中单个文件大小不能超过1M的**错误**描述也在传播,即如果读取超过1M的文件会报"Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)"的IOException,还引申出种种解决方案。个人认为不应该有这样的限制,为了验证这个说法写了个Demo,发现将近5M的压缩包在assets和raw中都能正常访问,因此在这里纠正一下,理论上只要打包不超过Android APK 50M大小的限制都是没有问题的。当然了,不排除是Android很早期的时候因为设备硬件原因aapt在编译的时候对这两个文件夹大小做出了限制,如果是这样,较新版的ADT应该不会出现这种情况。

更新:为了验证我最后一段的描述,避免导致结果误导,晚上写了几个小Demo验证之后又花了点时间查阅了一些资料,最后找到这篇文章http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ ,文章比较简单清晰,我就不翻译了。这篇文章应该还蛮有说服力的,从根本上说明了当时Android2.3以前产生资源文件单个文件大小不能超过1M的原因和部分解决方法。不过由于限制是当时的aapt决定的,现在已经更新了多个版本的aapt已经不存在这种问题了,也印证了我最后一段的猜想。

猜你喜欢

转载自blog.csdn.net/haonanren2bu2/article/details/48973857