Android中资源文件夹res/raw和assets的使用

494人阅读 评论(0) 收藏 举报 android xml 存储 string encoding layout

*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目录下可以再建立文件夹

*读取文件资源:

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

view plain
  1. InputStreamis=getResources().openRawResource(R.id.filename);

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

view plain
  1. AssetManageram=null;
  2. am=getAssets();
  3. InputStreamis=am.open("filename");

补充一下:在未知目录下有哪些文件,该去和获取这些文件的名称并把文件拷贝到目标目录中呢?(用于内置文件但不知道文件名称,需要筛选出想要的文件然后拷贝到目标目录中,推荐内置在assets文件夹中)
1.res/raw目录:
通过反射的方式得到R.java里面raw内部类里面所有的资源ID的名称,然后通过名称获取资源ID的值来读取我们想要的文件。(这个方法我没试过,有用过的同学麻烦发一段代码看看)。
2.assets目录:
getAssets().list("");来获取assets目录下所有文件夹和文件的名称,再通过这些名称再读取我们想要的文件。

assets:用于储藏必需打包到利用过程的静态文件,以便安排到装备中。与res/raw不同点在于,ASSETS扶持任意深度的子目录。这些文件不会生成任何资源ID,定然利用/assets开始(不包括它)的相对路径名。

res:用于储藏利用过程的资源(如图标、GUI格局等),将被打包到编译后的Java中。不扶持深度子目录

res/menu:储藏基于XML的菜单描写;

res/raw:储藏通用的文件, 该文件夹内的文件将不会被编译成二进制文件,按原样复制到装备上。

res/values:储藏字符串、尺寸值。

res/xml: 储藏通用的XML文件

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

在android开发中,我们离不开资源文件的利用,从drawable到string,再到layout,这些资源都为我们的开发供给了极大的方便,不过我们平时大局部工夫接触的资源目录等闲都是下面这三个。

/res/drawable

/res/values

/res/layout

但android的资源文件并何止这些,下面就为大家推荐一下另外三个资源目录

/res/xml

/res/raw

/assets

率先是/res/xml ,这个目录中大家可能偶尔用到过,这里能够用来存储xml款式的文件,并且和其他资源文件一样,这里的资源是会被编译成二进制款式放到最后的安装包里的, 我们也能够穿越R类来拜会这里的文件,并且解析里面的内容,例如我们在这里储藏了一个名为data.xml的文件:

<?xml version=xilie.org"1.0" encoding="utf-8"?>

<root>

<title>Hello XML4008301199.com!</title>

</root>

随后,我们就能够穿越资源ID来拜会并解析这个文件了

XmlResourceParser xml = getResources().getXml(R.xml.data);

xml.next();

int eventType = xml.getEventType();

boolean inTitle = false;

while(eventType != XmlPullParser.END_DOCUMENT) {

//到达title节点时符号一下

if(eventType == XmlPullParser.START_TAG) {

if(xml.getName().equals("title")) {

inTitle = true;

}

}

//如过到及格记的节点则取出内容

if(eventType == XmlPullParser.TEXT && inTitle) {

((TextView)findViewById(R.id.txXml)).setText(

xml.getText()

);

}

xml.next();

eventType = xml.getEventType();

}

在这里,我们用资源类的getXml措施,归来了一个xml解析器,这个解析器的工作原理和SAX措施差不多, 要当心的是,这里的xml文件,最后是会被编译成二进制形式的,万一大家想让文件原样存储的话,那么即将用到下一个目录啦,那即便/res/raw目录

这个目录的单一差异即便,这里的文件会原封不动的存储到装备上,不会被编译为二进制形式,拜会的措施也是穿越R类,下面是一个例子:

((TextView)findViewById(R.id.txRaw)).setText(

readStream(getResources().openRawResource(R.raw.rawtext))

);

private String readStream(InputStream is) {

try {

ByteArrayOutputStream bo = new ByteArrayOutputStream();

int i = is.read();

while(i !欧珀莱= -1) {

bo.write(i);

i = is.read();

}

return bo.toString();

} catch (IOException e) {

return "";

}

}

这次利用资源类中的措施,openRawResource,归来给我们一个输入流,这么我们就能够任意读取文件中的内容了,例如上面例子中那样,原样输出文本文件中的内容。

当然,万一你必需更高的自由度,尽量不受android平台的局限,那么/assets这个目录即便你的首选了~

这个目录中的文件除非不会被编译成二进制形式之外,另外一点即便,拜会措施是穿越文件名,而不是资源ID。并且还有更重要的一点即便,大家能够在这 里任意的发生子目录,而/res目录中的资源文件是不能自行发生子目录的。万一必需这种灵便的资源存储措施,那么就看看下面这个例子:

AssetManager assets = getAssets();

((TextView)findViewById(R.id.txAssets)).setText(

readStream(assets.open("data.txt"))

);

在context上下文中,调用getAssets归来一个AssetManager,然后利用open措施就能够拜会必需的资源了,这里open措施是以assets目录为根的。因而上面这段代码拜会的是assets目录中名为data.txt的资源文件~

更多相关文章

  1. [Android Studio / NDK] 如何使用javah生成.h文件
  2. Android 打开本地文件兼容7.0
  3. [Google Android] 理解NDK(1)-- 编译Android .so文件
  4. Android开发8——利用pull解析器读写XML文件
  5. Android必备:Android项目的目录结构
  6. Android 自动编译、打包生成apk文件 、命令行方式
  7. Android编程之文件操作
  8. Android 文件系统移植
  9. android studio修改配置文件(.android .gradle .AndroidStudio)

随机推荐

  1. Android(安卓)ListView内存优化
  2. Android(安卓)SDK Download List
  3. Android数据库代码备忘
  4. EditText 报出 “This text field does n
  5. Android布局属性
  6. Android(安卓)SDK安装教程
  7. 浅谈android的selector,背景选择器
  8. 解析Android消息处理机制:Handler/Thread/
  9. Android(安卓)Webview适配屏幕宽度
  10. Android3.2运行报错:[2011-09-09 14:50:21