*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下的文件资源,通过以下方式获取输入流来进行写操作
- InputStream is = getResources().openRawResource(R.id.filename);
2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作
- AssetManager am = null;
- am = getAssets();
- InputStream is = 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的资源文件~