本文转自百度知道,原文:百度知道问题
共同点:
它们会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式。
区别:
1 . 当然最直观的就是获取它们的InputStream的API不一样了。
assets:
InputStream assets = getAssets().open("xxxx");
raw:
InputStream raw=getResources().openRawResource(R.raw.xxxx)
有人可能会有疑问,既然它们都是被原封不动的拷贝到APK中,而assets可以创建目录结构,又能够动态的列出assets中的所有资源getAssets().list(String path);,这些raw都做不到,那raw还有什么用呢?
2 .主要的区别:
raw下的资源文件会生成id,可以通过id方便访问,
assets下的资源文件不会生成id,访问通过io流。
3 .raw下不能再有文件夹,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来访问这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。
另 外,网上关于assets和raw的资料都千篇一律了,因此关于这两者中单个文件大小不能超过1M的错误描述也在传播,即如果读取超过1M的文件 会报”Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)”的IOException,还引申出种种解决方案。
将近5M的压缩 包在assets和raw中都能正常访问,理论上只要打包不超过Android APK 50M大小的限制都是没有问题的。当然了,不排除是Android很早期的时候因为设备硬件原因aapt在编译的时候对这两个文件夹大小做出了限制,如果 是这样,较新版的ADT应该不会出现这种情况。
参考这篇文章http://ponystyle.com/blog/2010/03 /26/dealing-with-asset-compression-in-android-apps/ ,文章比较简单清晰。这篇文章应该还蛮有说服力的,从根本上说明了当时Android2.3以前产生资源文件单个文件大小不能超过1M的原 因和部分解决方法。