Android中assets目录和raw目录的区别和使用情况

转载 2015年07月07日 17:08:20

也可以参考:http://blog.csdn.net/luoshengyang/article/details/8738877


原文作者: futurexiong
原文地址: http://my.eoe.cn/futurexiong/archive/5350.html


今天看到有人问Android中assets目录和raw目录的区别和使用情况。



能提出这个问题的,应该都了解它们的共同点:


它们会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式。


要说区别,当然最直观的就是获取它们的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还有什么用呢?


下面我们来说说它们主要的区别:


由 于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,还引申出种种解决方案。个人认为不应该有这样的限制,为了验证这个说法写了个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已经不存在这种问题了,也印证了我最后一段的猜想。


Android复制res/raw目录的文件到SD卡下

前言        在应用开发中,我们会经常遇到操作工程中assets和res/raw目录下的文件,那么这两个目录有什么用呢?assets和res/raw工程目录下都可以存放一些小于1M(2.3版本以...
  • u013693649
  • u013693649
  • 2017年03月12日 19:47
  • 1925

Android Video播放Raw目录下的视频文件

比赛中遇到的一道题目就是从播放Raw目录下的视频,由于平常的开发中从来没这么干过,完全不符合常理的事情。下面记录一下播放的方法: mVideoView = (VideoView) fin...
  • qq_19560943
  • qq_19560943
  • 2017年03月21日 19:53
  • 853

android raw与assets区别

在Android工程的目录下,/assets是应用系统内部需要使用到的诸如音乐、视频类文件,而/res是应用的资源文件,/res内有一个/raw目录,这个目录和/assets有类似,这里记录一下两者的...
  • yxwbtb
  • yxwbtb
  • 2015年07月13日 16:39
  • 1527

android工程下assets与raw文件夹的区别

在android应用的开发中,当我们建一个新的工程后,我们会发现工程中包含了一个目录assets,工程的资源目录下会有一个raw目录(res/raw)。一,相同点:assets和res/raw工程目录...
  • qq_30098019
  • qq_30098019
  • 2016年05月31日 15:58
  • 2094

【安卓笔记】res/raw与assets区别

相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 2.assets目录下可以新建目录,而res/raw目录则不可以。 不同点: 1.由于...
  • RowandJJ
  • RowandJJ
  • 2014年02月13日 10:49
  • 2732

android三个特殊的资源目录 /res/xml /res/raw 和 /assets

在android开发中,我们离不开资源文件的使用,从drawable到string,再到layout,这些资源都为我们的开发提供了极大的便利,不过我们平时大部分时间接触的资源目录一般都是下面这三个。/...
  • shichexixi
  • shichexixi
  • 2010年11月03日 20:22
  • 20140

Android中打开raw目录下的数据库文件

在Android中不能直接打开res /raw目录中的数据库文件(.db)想要打开raw下的db文件需要如下步骤: 1、在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中。 复制的基本方法...
  • piscesq329a
  • piscesq329a
  • 2015年07月19日 17:56
  • 2710

Android中asset文件夹和raw文件夹区别

摘自:http://www.cnblogs.com/leizhenzi/archive/2011/10/18/2216428.html Android中asset文件夹和raw文件夹区别 *r...
  • Leichelle
  • Leichelle
  • 2012年08月19日 20:29
  • 20712

Android数据存储之——操作raw和assets目录下的文件

res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 res/raw和assets的不同点: 1.res/raw中的文件会被映射到R....
  • liuyi1207164339
  • liuyi1207164339
  • 2016年06月05日 17:57
  • 1018

资源—— 读取assets目录下的文件详细介绍

Android 中资源分为两种,一种是res下可编译的资源文件, 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,访问也很简单,只需要调用R.XXX.id即可;第二种就是放在assets...
  • chuntiandejiaobu10
  • chuntiandejiaobu10
  • 2016年08月29日 13:10
  • 8693
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中assets目录和raw目录的区别和使用情况
举报原因:
原因补充:

(最多只允许输入30个字)